还有,你需要区分几个不同的部分:
- HTTP服务器,由可变
http
- 的快速应用代表你的代码,代表通过
app
- 的Socket.IO服务器,通过
io
- 一个Socket.IO(客户端)连接表示(见下面)
HTTP服务器将“正常”HTTP请求引导至Express应用程序,该应用程序将根据设置的中间件和路由处理它们。使用(至少)两个参数(通常称为req
和res
)调用路由器处理程序来表示(传入)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
});
});
});
正如你所看到的,req
和res
不可那些Socket.IO事件处理程序内,因为那些仅用于正常的HTTP请求。
另外,与HTTP相反,当您收到消息时,您不一定必须将任何内容发送回客户端,因此我将该部分退出。上面的处理程序只将消息数据写入数据库(它也不检查或处理错误,最终应该添加)。
您使用ECMA6吗? – aguertin
@aguertin是的,我正在使用ES6。 –