使用Socket.io和Sequelize

时间:2017-03-29 20:30:55

标签: node.js sockets heroku socket.io sequelize.js

我正在尝试使用Socket.io和Sequelize来创建聊天应用。 Socket.io将处理套接字以允许即时消息传递。 Sequelize将处理存储消息,因此当您刷新屏幕时,您仍然可以收到消息。

发生的事情是在localhost上我的套接字工作,但它不会将消息发送到数据库。当我把它放到Heroku上时,我的数据库工作了,但它没有使用套接字。

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

我一直在研究这个bug一段时间了,我一直在努力寻求帮助。我认为分享这个的最佳方式是我创建的markdown详细说明了我在here找到我修复bug的努力。我可以找到我的回复here.

1 个答案:

答案 0 :(得分:1)

您需要区分几个不同的部分:

  • HTTP服务器,在您的代码中由变量http
  • 表示
  • Express应用,由app
  • 代表
  • Socket.IO服务器,由io
  • 表示
  • Socket.IO(客户端)连接(见下文)

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

Socket.IO服务器可以处理特定的Socket.IO请求,这些请求由Socket.IO客户端(在浏览器中运行)发送到服务器。当此类客户端与服务器建立连接时,将在服务器上触发connection事件。此事件的任何处理程序都将传递一个参数,通常称为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相反,当您收到消息时,您不必将任何内容发送回客户端,因此我将该部分留下。上面的处理程序只将消息数据写入数据库(它也不会检查或处理错误,最终你应该添加)。