这是其他人提出的问题,但是由于我使用的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
文件,这没有用。
所有路由都在app.js
传递任何io或socket对象之前设置在中。
我是否应该能够以require('socket.io')
某种方式使用它来发出所有连接的插座?
是否有一种明智的方式来存储连接的插座,../routes/socket.js
以便可以要求并从其他路径发出?
谁能指引我正确的方向?
我最终可以使用以下示例使事情正常进行:https : //github.com/expressjs/generator/issues/45#issuecomment-53719435
我创建了一个新文件,名为server/io.js
:
var io = require('socket.io')();
io.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
module.exports = io;
然后我更新server/bin/www
为:
#!/usr/bin/env node
var debug = require('debug')('gokibitz');
var app = require('../../server');
var io = require('../io');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
io.attach(server);
然后,在我的路线中,使用以下命令:
var io = require('../io');
...
io.emit(...);
至少对我而言,缺少的部分是能够分别创建io
对象,返回正确的对象,然后使用io.attach(server)
Insidebin/www
在正确的位置启动它的能力。
希望这会对我的足迹有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句