Expressjs 4路线分离

时间:2014-08-24 12:40:49

标签: javascript node.js express socket.io

我搞乱了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的引用传递给路由文件?

2 个答案:

答案 0 :(得分: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实例的文件中。

答案 1 :(得分:0)

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内部,您可以传入任何内容。