Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何从express route内发射到socket.io房间_Node.js_Socket.io - Fatal编程技术网

Node.js 如何从express route内发射到socket.io房间

Node.js 如何从express route内发射到socket.io房间,node.js,socket.io,Node.js,Socket.io,我有以下代码结构: /app.js var user = require('./server/routes/api/user'); var io = require('socket.io').listen(server); require('./server/sockets/base')(io); router.post('/login', function(req, res){ // HERE I WANT TO EMIT THE EVENT BY USING io.to("someroo

我有以下代码结构:

/app.js

var user = require('./server/routes/api/user');
var io = require('socket.io').listen(server);
require('./server/sockets/base')(io);
router.post('/login', function(req, res){
 // HERE I WANT TO EMIT THE EVENT BY USING io.to("someroom").emit("news", "news");
 // I TRIED req.socket.emit('news', { hello: 'world' }); without luck
}
var server = require('./app.js');
var io = require('socket.io').listen(server);
module.exports = io;
module.exports = server;
var user = require('./server/routes/api/user');
var io = require('./socket.js');
require('./server/sockets/base')(io);
var io = require('../../../socket.js');
router.post('/login', function(req, res){
    io.to("someroom").emit("news", "news");
}
我知道我可以通过以下方式发出事件(已测试且有效)

问题是,我希望能够从我的路由文件发出事件,该文件无权访问io对象

/routes/api/user.js

var user = require('./server/routes/api/user');
var io = require('socket.io').listen(server);
require('./server/sockets/base')(io);
router.post('/login', function(req, res){
 // HERE I WANT TO EMIT THE EVENT BY USING io.to("someroom").emit("news", "news");
 // I TRIED req.socket.emit('news', { hello: 'world' }); without luck
}
var server = require('./app.js');
var io = require('socket.io').listen(server);
module.exports = io;
module.exports = server;
var user = require('./server/routes/api/user');
var io = require('./socket.js');
require('./server/sockets/base')(io);
var io = require('../../../socket.js');
router.post('/login', function(req, res){
    io.to("someroom").emit("news", "news");
}

使用此文件夹结构发射的最简单方法是什么?

您的路由需要
io
对象,因此您必须将其作为参数传递

在user.js中:

module.exports = function (io) {

    // all of this router's configurations

    router.post('/login', function (req, res, next) {
        io.to('someroom').emit('news', 'news');
    });

    return router;

}
使用路由时,请将其引用到
io

app.use(..., user(io));

只需导出套接字,并在任何您想从中使用它的文件中要求它

/socket.js

var user = require('./server/routes/api/user');
var io = require('socket.io').listen(server);
require('./server/sockets/base')(io);
router.post('/login', function(req, res){
 // HERE I WANT TO EMIT THE EVENT BY USING io.to("someroom").emit("news", "news");
 // I TRIED req.socket.emit('news', { hello: 'world' }); without luck
}
var server = require('./app.js');
var io = require('socket.io').listen(server);
module.exports = io;
module.exports = server;
var user = require('./server/routes/api/user');
var io = require('./socket.js');
require('./server/sockets/base')(io);
var io = require('../../../socket.js');
router.post('/login', function(req, res){
    io.to("someroom").emit("news", "news");
}
/app.js

var user = require('./server/routes/api/user');
var io = require('socket.io').listen(server);
require('./server/sockets/base')(io);
router.post('/login', function(req, res){
 // HERE I WANT TO EMIT THE EVENT BY USING io.to("someroom").emit("news", "news");
 // I TRIED req.socket.emit('news', { hello: 'world' }); without luck
}
var server = require('./app.js');
var io = require('socket.io').listen(server);
module.exports = io;
module.exports = server;
var user = require('./server/routes/api/user');
var io = require('./socket.js');
require('./server/sockets/base')(io);
var io = require('../../../socket.js');
router.post('/login', function(req, res){
    io.to("someroom").emit("news", "news");
}
/routes/api/user.js

var user = require('./server/routes/api/user');
var io = require('socket.io').listen(server);
require('./server/sockets/base')(io);
router.post('/login', function(req, res){
 // HERE I WANT TO EMIT THE EVENT BY USING io.to("someroom").emit("news", "news");
 // I TRIED req.socket.emit('news', { hello: 'world' }); without luck
}
var server = require('./app.js');
var io = require('socket.io').listen(server);
module.exports = io;
module.exports = server;
var user = require('./server/routes/api/user');
var io = require('./socket.js');
require('./server/sockets/base')(io);
var io = require('../../../socket.js');
router.post('/login', function(req, res){
    io.to("someroom").emit("news", "news");
}
然后在路由器里

router.get('/', (req, res) => {
  req.app.get('io').to('someroom').emit('news', 'news');
});

据我所知,您不能使用tpc连接,但混合使用https请求和套接字调用是行不通的。@jack.the.ripper可能他只是想在有人使用HTTP登录时通知房间。您是否尝试过导出io并从另一个文件中请求它?@liadmat我尝试过类似的方法,但在web请求中执行任何套接字操作时遇到了很多问题,如果您对如何执行有可靠的参考资料,我希望取得成功,干杯@jack.the.ripper,我添加了一个答案在我的应用程序中发生的是,用户设置了他的当前位置,而我的node.js服务器存储了该位置。基于该用户位置,我的节点服务器+mongodb返回几个附近的位置,我想向这些附近的位置广播一条消息。到目前为止,这打断了我的路由,但我正在调查它似乎无法摆脱我在所有用户路由上得到的错误“无效HTTP状态代码404”。解决了这个问题,我的404路由在我的用户路由之前加载。谢谢你的回答,这解决了我的问题!问题是服务器变量在socket.js中不可用。它是在app.js中声明的,比如:var server=app.listen(app.get('port')、function(){debug('Express server侦听端口'+server.address().port);console.log(“Express server start!”);}@乔尔现在退房。从
app.js
导出服务器,并在
socket.js
中要求它。