javascript - ExpressJS - 带有路由分离的 Socket.IO

标签 javascript node.js socket.io express

我正在努力了解 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');
    }
}

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

routes = requires("routes/myRoutes")(io);

最佳答案

好吧,你真的不需要 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');
        });
    });
};

好了!

关于javascript - ExpressJS - 带有路由分离的 Socket.IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12566731/

相关文章:

javascript - 内容超出标题

javascript - 如何修复滚动侧边栏?

node.js - 在 nodejs socket.io 中显示连续连接消息

javascript - 如何测试纯 Vue 组件(不是单个文件组件)

javascript - 使用 onclick 事件使用页面中的数据填充表格中的单元格

node.js - 无法执行 "npm install --save firebase"

javascript - 如何使用 npm 在 Windows 8(64 位)上安装 v8-profiler?

node.js - node-postgres 不会插入数据,但也不会抛出错误

node.js - Socket.io 客户端 socket.io@0.9.16

javascript - Socket.io 和 Node.Js 多服务器