javascript – 如何使用我的Express 4路由中的socket.io向连接的套接字发送事件?

前端之家收集整理的这篇文章主要介绍了javascript – 如何使用我的Express 4路由中的socket.io向连接的套接字发送事件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是其他人提出的问题,但由于我的Express设置不同,我无法从他们给出的答案中受益.

我已经实现了socket.io并在我的服务器上以一种简单的方式工作.这是它的工作原理:

在bin / www中:

  1. #!/usr/bin/env node
  2. var debug = require('debug')('gokibitz');
  3. var app = require('../../server');
  4.  
  5. app.set('port',process.env.PORT || 3000);
  6.  
  7. var server = app.listen(app.get('port'),function() {
  8. debug('Express server listening on port ' + server.address().port);
  9. });
  10.  
  11. var io = require('socket.io').listen(server);
  12.  
  13. io.on('connection',require('../routes/socket.js'));

我的所有路线和其他Express设置都在../../server.js中.

  1. var routes = require('./server/routes/index');
  2. var user = require('./server/routes/user');
  3. ...
  4.  
  5. app.use('/',routes);
  6. app.use('/api/user/',user);
  7. ...
  8. app.use('*',routes);

然后在../routes/socket.js中,我有这个样板:

  1. module.exports = function (socket) {
  2. socket.emit('send:news',{ hello: 'world' });
  3.  
  4. setInterval(function () {
  5. socket.emit('send:time',{
  6. time: (new Date()).toString()
  7. });
  8. },1000);
  9.  
  10. return socket;
  11. };

我可以补充说,这工作得非常好.但是现在我希望能够在我非常普通的Express应用程序中从各种路径发出事件,而且我无法找到正确的方法获取对我需要的套接字对象的引用.

示例:当用户发表评论时,我想向所有连接的用户发出一个事件,通知他们新的评论.从我的路由文件(./server/routes/user.js),如何访问我需要发出事件的对象?

这是路径文件中相关位的框架:

  1. var express = require('express');
  2. var router = express.Router();
  3.  
  4. router.post('/',function (req,res) {
  5. ...
  6. });
  7.  
  8. module.exports = router;

我可以访问它的唯一地方是../routes/socket.js文件,这是无用的.

在有任何io或socket对象传入之前,所有路由都在app.js中设置.

我是否应该能够(‘socket.io’)并以某种方式使用它来发射到所有连接的套接字?

是否有一种明智的方法可以将连接的套接字存储在../routes/socket.js上,以便可以从其他路径中将其连接到需要的位置?

任何人都可以引导我朝着正确的方向前进吗?

解决方法

我最终能够使用这个例子来解决问题:
https://github.com/expressjs/generator/issues/45#issuecomment-53719435

我创建了一个名为server / io.js的新文件

  1. var io = require('socket.io')();
  2.  
  3. io.on('connection',function (socket) {
  4. socket.emit('news',{ hello: 'world' });
  5. socket.on('my other event',function (data) {
  6. console.log(data);
  7. });
  8. });
  9.  
  10. module.exports = io;

然后我将server / bin / www更新为:

  1. #!/usr/bin/env node
  2. var debug = require('debug')('gokibitz');
  3. var app = require('../../server');
  4. var io = require('../io');
  5.  
  6. app.set('port',function() {
  7. debug('Express server listening on port ' + server.address().port);
  8. });
  9.  
  10. io.attach(server);

然后,在我的路线中,我使用这个:

  1. var io = require('../io');
  2. ...
  3. io.emit(...);

至少,我缺少的部分是能够单独创建io对象,返回正确的对象,然后在bin / www中使用io.attach(服务器)在正确的位置启动它.

希望这会帮助其他人追随我的脚步.

猜你在找的JavaScript相关文章