【发布时间】:2018-05-29 23:30:01
【问题描述】:
我有 express/nodejs api。我正在向它添加 socket.io 功能。目前我的所有路由都在单独的文件夹中,我将它们包含在 server.js 文件中并将它们用作 app.use() 函数。
在 server.js 文件中,我还通过监听特定端口(例如 3000)来启动 express 服务器,如下所示。
let server = app.listen(3000);
根据所有谷歌搜索,我发现我需要传递服务器变量来初始化 socket.io,如下所示。
let io = require('socket.io')(server);
现在的问题是,既然它需要这个变量,那么我如何在不同文件夹中的路由文件中使用 socket.io 来发送和接收来自客户端的事件?
更新
在 server.js 文件中
let route = require('./routes/route');
let app = express();
let server = app.listen(3000);
console.log('Listening to port');
let io = require('socket.io')(server);
app.use('/api/1.0/events', route(io));
在 route.js 文件中
let express = require('express');
module.exports = (io) => {
console.log('IO: ', io);
};
更新 2
server.js 文件
let express = require('express');
let events = require('./routes/events');
let app = express();
let server = app.listen(3000);
let io = require('socket.io')(server);
app.use(function(request, response, next) {
request.io = io;
next();
});
app.use('/events', events);
events.js 文件
let express = require('express');
let Events = require('../models/events');
apiRoutes.post('/new', function(request, response) {
let newEvent = new Events(request.body);
newEvent.save((error, result) => {
if (error) {
response.json(error);
} else {
// console.log('ELSE');
// request.io.on('connect', socket => {
// console.log('LISTENING TO SOCKET...');
request.io.on('EventCreated', data => {
console.log('DATA ON Server: ', data);
});
// });
response.json({
success: true,
message: 'New event created'
});
}
});
});
【问题讨论】:
-
使用 module.exports 将您的
io变量导出到其他文件 -
感谢您的回复,但如何导出?我的意思是在哪个文件中。我在 server.js 文件中需要它。你能提供任何示例代码吗?
-
你永远不想在像
request.io.on()这样的请求处理程序中安装一个事件处理程序,因为每次路由被命中时你都会添加一个新的事件处理程序,它们会永远堆积起来。另外,您不会使用io.on()监听单个套接字事件。您使用socket.on()侦听消息事件。所以,你在这里的整个方法是错误的。您必须备份并从一开始就描述您试图解决的整体问题,以便我们帮助您解决这个问题。但是,由于问题的不同部分已经有好几天了,我认为您需要为此提出一个新问题。 -
我要解决的问题是用户将创建一个事件。用户将填写表单并按下创建事件按钮(单击“创建事件”按钮并关闭表单,用户会看到事件列表页面)。它将数据发送到服务器并存储数据库。一旦它被存储,然后发出新事件并在客户端上监听该事件。并使用新创建的事件更新事件页面上的事件列表。
标签: javascript node.js sockets express