【问题标题】:Expressjs 4 route separationExpressjs 4 路由分离
【发布时间】:2014-10-17 18:28:52
【问题描述】:

我在搞乱socketIO,目前我有一个单独的路由文件:

//api.js
var express  = require('express');
var router   = express.Router();

router.get('/test', function (req, res) {
  io.sockets.emit("change", {message: "this is a test"}); //io is NOT referenced!!!
  response.send(200);
});

module.exports = router;

io 在我的server.js 中被引用,就像这样

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

在使用 socketIO 之前,我包含了 api 路由文件并在所有路由前加上 /api,如下所示:

var api = require('./server/routes/api');
app.use('/api', api);

问题:如何将 socketIO io 的引用传递给路由文件?

【问题讨论】:

  • 方法有很多种,包括导出带参数的init函数,导出just带参数的函数等
  • 如果你有时间戴夫,我会非常感激一个例子。我考虑过导出函数,但后来我不知道如何仍然应用/api 前缀

标签: javascript node.js express socket.io


【解决方案1】:

有很多方法可以做到这一点。您可以像这样将您的实例直接传递给您的路线:

// api.js
var express  = require('express');
var router   = express.Router();
var io;

router.get('/test', function (req, res) {
  io.sockets.emit("change", {message: "this is a test"});
  response.send(200);
});

module.exports = function(sio) {
  io = sio;
  return router;
};


// server.js
var api = require('./server/routes/api');
app.use('/api', api(io));

或者您可以将您的 socket.io 实例放在一个单独的文件中,您可以将 require() 放在任何需要 socket.io 实例的文件中。

【讨论】:

    【解决方案2】:

    api 前缀不相关。

    (非常)大概是这样的:

    api.js

    var router  = require('express').Router();
    
    module.exports = function(io) {
      router.get('/test', function (req, res) {
        io.sockets.emit("change", {message: "this is a test"});
        response.send(200);
      });
    
      return router;
    };
    

    server.js 片段

    var api = require('./server/routes/api')(io);
    app.use('/api', api);
    

    您不需要只在模块级别公开该函数,例如,您可以公开一个init 函数,就像普通模块公开函数一样:

    api.js

    exports.init = function (io) {
      router.get('/test', function (req, res) {
        io.sockets.emit("change", {message: "this is a test"});
        response.send(200);
      });
    
      return router;
    };
    

    server.js 片段

    var api = require('./server/routes/api');
    app.use('/api', api.init(io));
    

    我远离任何我可以测试的东西,但简而言之,你想公开一个接受 io 变量的函数。在那个函数 io 里面是你传入的任何东西。

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多