6

我试图了解 ExpressJS 和 Socket.IO。我将路线放在一个单独的文件中,我从我的 app.js 中包含该文件:

var express = require('express')    
  , db = require('./db')
  , mongoose = require('mongoose')
  , models = require('./models/device')
  , http = require('http')
  , path = require('path')
  , app = express()
  , server = http.createServer(app)
  , io = require('socket.io').listen(server)
  , routes = require('./routes/myRoutes');

但是,当我尝试从我的一条路线发出事件时,我没有引用 socket.io。

exports.update = function(req, res){
    return Item.findById(req.params.id, function(err, item) {
       // Do some checks and save.
       socket.emit('updated');
    }
}

我理解为什么这可能不可用。相反,我不明白处理 socket.io 的最佳方法是从 app.js 以外的另一个文件中获取什么。我在看这个问题(见里卡多的回答),但我仍然不清楚。理想情况下,我想避免这样做:

路线=需要(“路线/我的路线”)(io);

4

5 回答 5

9

好吧,您实际上并不需要 express.io。最简单的解决方案是导出一个新模块并将其传递给 socket.io 实例的引用。所以在你的 app.js 你有:

var express = require('express'),
  ...
  , server = http.createServer(app)
  , io = require('socket.io').listen(server)
  , routes = require('./routes/myRoutes');

现在需要一个新模块并将 socketio 引用传递给它。添加这个新行(在 app.js 中)这样做:

require('./app/path/to/your/socketio/controller/socketio')(io);

然后在您的path/to/your/socketio/controller名为 socketio.js的新文件中创建一个新文件

最后在 socketio.js 文件中,导出你的新模块:

module.exports = function(io) {

    io.sockets.on('connection', function (socket) {

        socket.on('captain', function(data) {

            console.log(data);

            socket.emit('america');
        });
    });
};

你去吧!

于 2014-04-22T02:34:12.857 回答
5

查看express.io

它具有实时请求的路由,以及许多其他有用的功能。

app = require('express.io')()
app.http().io()

app.io.route('example', function(req) {
    // do something interesting
}))

app.listen(7076)

至于四处走动,必须通过io对象。您有几个选择,取决于您询问的对象,它们可能是“最好的”,也可能不是“最好的”。

  • 制造ioapp全球。(有些人对全局感到恐惧)
  • 使用module.exportsrequire其他文件中的对象。(如果处理不当可能会导致循环依赖问题)

传递io对象可能是最干净最简单的方法,但您确实有选择。

于 2012-12-31T15:00:06.283 回答
2

socket.io 不适用于路由,它适用于套接字。

将此代码添加到 app.js 或包含在 app.js 中的单独文件中:

io.sockets.on('connection', function (socket) {
  socket.on('update', function (your_id) {
    Item.findById(your_id, function(err, item) {
      socket.emit('send_update', item);
    }
  });
});

您的更新路线仅使用 javascript 呈现 html 文档,其中包含:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.emit('update', { your_id: '1' });
  socket.on('send_update', function (data) {
    console.log(data);
  });
</script>

因此,一旦页面呈现并完成,client-javascript 将打开一个到服务器的套接字并接收额外的数据。

在此处查看更多示例。

免责声明:从头开始编写且未经测试的代码。

于 2012-09-24T16:47:13.397 回答
2

最好的方法是使用闭包。前任:

exports.update = function(socket){
  return function(req, res) {
    //In here now you can have the reference to the socket io
    Item.findById(req.params.id, function(err, item) {
       // Do some checks and save.
       socket.emit('updated');
    }
  }
}

和:

app.post('/your_path', update(io));
于 2014-03-05T02:11:42.260 回答
0

我使用了Expressjs的中间件路由器(我使用的是 4.x)。

在外部路由文件中,我放置了“下一个”对象:

module.exports = function(app, settings){
    app.post('/something', function(req, res, next) {
    ...
    next();
    }
};

在主文件中,我在 io.on('connection') 中写入了最后一个路由跳:

io.on('connection', function (socket) {

    // Final route for middlewares who need to interact with socket.io
    app.post('/something', function (req, res, next) {
        socket.emit('event', { result: 'ok' });
    });

});
于 2015-08-19T15:53:17.867 回答