将 Socket.io 与 Sequelize 一起使用

Posted

技术标签:

【中文标题】将 Socket.io 与 Sequelize 一起使用【英文标题】:Using Socket.io with Sequelize 【发布时间】:2017-08-23 12:50:51 【问题描述】:

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

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

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

我已经研究这个错误一段时间了,我一直在努力寻求帮助。我认为分享这一点的最佳方式是使用我创建的降价,详细说明我为修复我的错误所做的努力,可以在here 找到。我的 repo 可以在 here.

找到

【问题讨论】:

你在使用 ECMA6 吗? @aguertin 是的,我正在使用 ES6。 【参考方案1】:

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

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

HTTP 服务器将“正常”HTTP 请求定向到 Express 应用程序,该应用程序将根据设置的中间件和路由处理它们。使用(至少)两个参数调用路由器处理程序,通常称为 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 不同的是,您不必在收到消息后将任何内容发送回客户端,因此我省略了该部分。上面的处理程序仅将消息数据写入数据库(它也不会检查或处理错误,最终您应该添加)。

【讨论】:

我认为这是正确的轨道,但是,现在我收到了这个错误。 Executing (default): INSERT INTO "Messages" ("id","createdAt","updatedAt") VALUES (DEFAULT,'2017-03-30 04:20:30.667 +00:00','2017-03-30 04:20:30.667 +00:00') RETURNING *; Unhandled rejection SequelizeBaseError: null value in column "message" violates not-null constraint。我在markdown中最后列出了完整的错误,我的尝试here现在似乎没有阅读消息框中的消息。 该错误表明Messages 表/模型要求字段message 始终包含有效值。您显示的插入语句未设置该字段,因此出现错误。 嗯,插入语句?你的意思是来自views/messages/index.ejs <input id="m" autocomplete="off" type="text" class="form-control" name="message" placeholder="Your Message" />?我要添加的值是我在该输入中键入的消息。当我点击提交时,它说它为空,但我知道我在表单中输入了一条消息。 您可以在错误消息中的插入语句中看到message 没有被设置。另外,您如何将表单数据发送到 Socket.IO 服务器?最后:您可以在插入/创建语句之前轻松插入console.log(data),以查看数据实际包含的内容。 我遇到了同样的错误。看起来插入语句没有被触发,因为它不是控制台记录任何东西。我正在将这些更改推送到 GitHub 上供您查看。

以上是关于将 Socket.io 与 Sequelize 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将 socket.io 与 redux 一起使用

将 pm2 的集群模块与 socket.io 和 socket.io-redis 一起使用

是否可以将 React Native 与 socket.io 结合使用

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用

是否可以将 Websockets/Socket.IO 与蜂窝数据/4g 一起使用?

如何将 socket.io 与 graphql 订阅一起使用?