【发布时间】:2015-04-01 23:03:18
【问题描述】:
这是其他人提出的一个问题,但由于我的 Express 设置不同,我无法从他们给出的答案中受益。
我已经在我的服务器上实现了 socket.io 并以一种简单的方式工作。它是这样工作的:
在bin/www:
#!/usr/bin/env node
var debug = require('debug')('gokibitz');
var app = require('../../server');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
var io = require('socket.io').listen(server);
io.on('connection', require('../routes/socket.js'));
我所有的路线和其他 Express 设置都在 ../../server.js。
var routes = require('./server/routes/index');
var user = require('./server/routes/user');
...
app.use('/', routes);
app.use('/api/user/', user);
...
app.use('*', routes);
然后在../routes/socket.js,我有这个样板:
module.exports = function (socket) {
socket.emit('send:news', { hello: 'world' });
setInterval(function () {
socket.emit('send:time', {
time: (new Date()).toString()
});
}, 1000);
return socket;
};
我可以补充一下,这很好用。但现在我希望能够在我非常普通的 Express 应用程序中从各种路由发出事件,但我终其一生都无法找出正确的方法来获取对我需要的套接字对象的引用。
示例:当用户发表评论时,我想向所有连接的用户发出一个事件,通知他们有新评论。从我的路由文件 (./server/routes/user.js) 中,我怎样才能访问我需要发出事件的对象?
以下是路由文件中相关位的骨架:
var express = require('express');
var router = express.Router();
router.post('/', function (req, res) {
...
});
module.exports = router;
我唯一可以访问的地方是../routes/socket.js文件,没用。
在传入任何 io 或 socket 对象之前,所有路由都设置在 app.js 中。
我应该能够require('socket.io') 并以某种方式使用它来向所有连接的套接字发射吗?
是否有一种明智的方式将连接的套接字存储在 ../routes/socket.js 上,以便可以从其他路由中获取和发出?
谁能引导我朝着正确的方向前进?
【问题讨论】:
-
从路由中,您是否尝试向所有连接的用户广播消息?还是只发送给在路由上提出请求的用户?你想从你的路线发送给谁?
io.emit(msg, data)将发送给所有连接的客户端。如果您从另一个模块执行此操作,则必须将io变量共享给该其他模块。 -
我正在尝试从一条路由向所有连接的用户广播一条消息。示例:用户向帖子添加评论。我想向所有用户广播(命名空间)事件,以便查看该帖子的任何人都可以收听更新并使用新评论刷新他们的页面。我知道我需要共享 io 对象,但我正在努力寻找正确的方法来使用我的设置。
-
在最后一种情况下,您需要创建一个单例返回对象或使其全局化。
标签: javascript node.js express socket.io-1.0