我有点困惑;
我想在NodeJS应用程序上使用socketIO。 我创建了这个(伪)代码:
//server.js
var app = express();
//some code...
var router = require('./app/router');
app.use(router);
var server = app.listen(appConfig.app.port, function () {
var port = server.address().port;
});
var io = require('socket.io')(server);
io.on('connection', function (client) {
console.log('Client connected...');
client.on('join', function (data) {
console.log(data);
});
});
//client.js
var socket = io.connect('http://localhost:5555');
socket.on('connect', function(data) {
socket.emit('join', 'Hello World from client');
});
一切都很好。但是!
现在,我想在另一个文件中发出事件。 我有路由器和POST请求。我想在POST请求上发出事件(请求处理程序在另一个文件中)。
//router.js
router.route("/addmenu").post(function (req, res) {
menuModel.addMenu(req.body,function(data){
//I WANT EMIT HERE
res.json(data)
});
};
);
我必须在启动服务器之前初始化路由器,但我必须将服务器传递给IO ...如何将IO传递给路由器?
答案 0 :(得分:3)
你可以试试这个
//server.js
var app = express();
//some code...
var io;
var getIOInstance = function(){
return io;
};
var router = require('./app/router')(getIOInstance);
app.use(router);
var server = app.listen(appConfig.app.port, function () {
var port = server.address().port;
});
io = require('socket.io')(server);
io.on('connection', function (client) {
console.log('Client connected...');
client.on('join', function (data) {
console.log(data);
});
});
//router.js
module.exports = function(getIOInstance){
router.route("/addmenu").post(function (req, res) {
menuModel.addMenu(req.body,function(data){
//I WANT EMIT HERE
getIOInstance().sockets.emit(...)
res.json(data)
});
};
return router;
);
如果您想要通知&#39>此解决方案将有效。所有连接的客户。
如果您只需要通知特定客户端,那么我会建议您使用事件发射器模块来传达这些事件,而不是跨多个文件共享您的套接字实例。
答案 1 :(得分:2)
在router.js中,您可以执行以下操作:
class Class2 : IInfoCard
{
public string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
答案 2 :(得分:0)
@jahnestacado 的回答完成了这项工作,但如果您已经有一个现有的代码库,那么您需要更改每个文件的结构,您可能需要 socket.io 对象,将它作为一个论证。
一个更好的方法是:
创建 getIO() 函数——就像 @jahnestacado 所做的那样——,在其中实例化 io 对象(在 server.js 中),然后将其导出。
ServletContext
然后在您需要的任何地方使用它。但请确保仅在需要时才执行该功能。通常在您的控制器函数中:
var io;
exports.getIO = () => io;
请注意,我没有在控制器函数之外调用 getIO 函数。例如,以下内容可能不起作用:
const getIO = require('../server').getIO;
exports.updateSAE = (req, res) => {
let io = getIO();
io.emit();
// rest of your controller function code
}
很简单,因为调用函数时 socket.io 对象可能没有被初始化,因此返回 undefined。