我正在尝试使用Socket.io和Sequelize来创建聊天应用。 Socket.io将处理套接字以允许即时消息传递。 Sequelize将处理存储消息,因此当您刷新屏幕时,您仍然可以收到消息。
发生的事情是在localhost上我的套接字工作,但它不会将消息发送到数据库。当我把它放到Heroku上时,我的数据库工作了,但它没有使用套接字。
我的套接字位于app.js
,我的数据库路径位于routes/messages.js
。
我一直在研究这个bug一段时间了,我一直在努力寻求帮助。我认为分享这个的最佳方式是我创建的markdown详细说明了我在here找到我修复bug的努力。我可以找到我的回复here.
答案 0 :(得分:1)
您需要区分几个不同的部分:
http
app
io
HTTP服务器指示"正常"对Express应用程序的HTTP请求,它将根据设置的中间件和路由处理它们。使用(至少)两个参数调用路由器处理程序,通常称为req
和res
,以表示(传入)HTTP请求和(传出)HTTP响应。
Socket.IO服务器可以处理特定的Socket.IO请求,这些请求由Socket.IO客户端(在浏览器中运行)发送到服务器。当此类客户端与服务器建立连接时,将在服务器上触发connection
事件。此事件的任何处理程序都将传递一个参数,通常称为socket
,表示与该客户端的(双向)连接。
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相反,当您收到消息时,您不必将任何内容发送回客户端,因此我将该部分留下。上面的处理程序只将消息数据写入数据库(它也不会检查或处理错误,最终你应该添加)。