2017-03-29 58 views
0

我正在尝试使用Socket.io和Sequelize创建一个聊天应用程序。 Socket.io将处理套接字以允许即时消息。 Sequelize将处理存储消息,所以当你刷新屏幕时,你仍然有你的消息。与Sequelize一起使用Socket.io

发生什么事情是在本地主机上我的套接字工作,但它不会将消息发送到数据库。当我把它放到Heroku上时,我的数据库工作,但它不使用套接字。

我的套接字位于app.js,我的数据库路由位于routes/messages.js

我一直在研究这个bug一段时间,我一直在试图得到它的帮助。我认为分享这个最好的方法是我创建的降价细节我的努力修复我可以在here发现的错误。我给这家回购可以发现here.

+0

您使用ECMA6吗? – aguertin

+0

@aguertin是的,我正在使用ES6。 –

回答

0

还有,你需要区分几个不同的部分:

  • HTTP服务器,由可变http
  • 的快速应用代表你的代码,代表通过app
  • 的Socket.IO服务器,通过io
  • 一个Socket.IO(客户端)连接表示(见下面)

HTTP服务器将“正常”HTTP请求引导至Express应用程序,该应用程序将根据设置的中间件和路由处理它们。使用(至少)两个参数(通常称为reqres)调用路由器处理程序来表示(传入)HTTP请求和(传出)HTTP响应。

Socket.IO服务器获取特定的Socket.IO请求,该请求通过Socket.IO客户端(运行在浏览器中)发送到服务器。当这样的客户端与服务器建立连接时,在服务器上触发事件。此事件的任何处理程序都将传递一个参数,通常称为socket,表示与该客户端的(双向)连接。

Socket.IO连接可以接收消息(从浏览器中运行的客户端发送),这会触发套接字上的事件。您可以安装处理程序来侦听特定消息(如“聊天消息”),该消息将接收客户端发送给它的数据作为参数。

你的代码中的问题似乎是设置一切来处理这些聊天消息。正确的安装顺序是:

  • 听的Socket.IO服务器上connection事件
  • 当接收到这样的事件,连接
  • 当这样的事件添加一个侦听器chat message事件收到后,将数据写入数据库。

在代码:

// Listen for new client connections. 
io.on('connection', function(socket) { 

    // Listen for the client to send a _"chat message"_ message. 
    socket.on('chat message', function(data) { 

    // Store the data in the database. 
    models.Messages.create({ 
     message : data.message, 
     username : data.username 
    }); 

    }); 
}); 

正如你所看到的,reqres不可那些Socket.IO事件处理程序内,因为那些仅用于正常的HTTP请求。

另外,与HTTP相反,当您收到消息时,您不一定必须将任何内容发送回客户端,因此我将该部分退出。上面的处理程序只将消息数据写入数据库(它也不检查或处理错误,最终应该添加)。

+0

我认为这是正确的轨道,但是,现在我得到这个错误。 '执行(默认):INSERT INTO“消息”(“id”,“createdAt”,“updatedAt”)值(默认值'2017-03-30 04:20:30.667 +00:00','2017-03- 30 04:20:30.667 +00:00')RETURNING *; 未处理的拒绝SequelizeBaseError:列“消息”中的空值违反了非空约束。我有我的企图[这里](https://github.com/jenkaplan/vortxt/blob/master/attempts%20to%20fix%20socket%20database%20issue.md)markdown最后列出的完整的错误似乎是这样的它现在不读取消息框中的消息。 –

+0

这个错误表明'Messages'表/模型要求字段'message'始终包含一个有效值。您显示的插入语句不会设置该字段,因此会导致错误。 – robertklep

+0

嗯,插入语句?你的意思是来自views/messages/index.ejs' '?我试图添加的值是我输入到该输入中的一条消息。当我点击提交时,它说它是空的,但我知道我在表单中输入了一条消息。 –