Nat*_*ate 6 javascript node.js express socket.io-1.0
这是其他人提出的问题,但由于我的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'));
Run Code Online (Sandbox Code Playgroud)
我的所有路线和其他快速设置都在 ../../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);
Run Code Online (Sandbox Code Playgroud)
然后进去 ../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;
};
Run Code Online (Sandbox Code Playgroud)
我可以补充说,这工作得非常好.但是现在我希望能够在我非常普通的Express应用程序中从各种路径发出事件,而且我无法找到正确的方法来获取对我需要的套接字对象的引用.
示例:当用户发表评论时,我想向所有连接的用户发出一个事件,通知他们新的评论.从我的路由文件(./server/routes/user.js),我如何访问我需要发出事件的对象?
这是路径文件中相关位的框架:
var express = require('express');
var router = express.Router();
router.post('/', function (req, res) {
...
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
我可以访问它的唯一地方是../routes/socket.js文件,这是没用的.
所有路由都设置在a app.js之前,任何io或socket对象都要传入.
我是否应该以require('socket.io')某种方式使用它来发射到所有连接的插座?
是否有一种合理的方法来存储连接的插座,../routes/socket.js以便可以从其他路径发送到哪个?
任何人都可以引导我朝着正确的方向前进吗?
Nat*_*ate 15
我最终能够使用这个例子来解决问题: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;
Run Code Online (Sandbox Code Playgroud)
然后我更新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);
Run Code Online (Sandbox Code Playgroud)
然后,在我的路线中,我使用这个:
var io = require('../io');
...
io.emit(...);
Run Code Online (Sandbox Code Playgroud)
对我来说,缺少的部分至少是能够io单独创建对象,返回正确的对象,然后使用io.attach(server)内部bin/www在正确的位置启动它.
希望这会帮助其他人追随我的脚步.
| 归档时间: |
|
| 查看次数: |
6046 次 |
| 最近记录: |