将 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 应用程序,该应用程序将根据设置的中间件和路由处理它们。使用(至少)两个参数调用路由器处理程序,通常称为 req
和 res
,以表示(传入)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
);
);
);
如您所见,req
和 res
在这些 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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
将 pm2 的集群模块与 socket.io 和 socket.io-redis 一起使用
是否可以将 React Native 与 socket.io 结合使用
如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用