Javascript Expressjs 4路线分隔

Javascript Expressjs 4路线分隔,javascript,node.js,express,socket.io,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(

我和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
在my
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 routes文件,并在所有routes前面加上
/api
,如下所示:

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

问题:如何将对socketIO的引用
io
传递到routes文件?

有多种方法可以做到这一点。您可以将实例直接传递到路由,如下所示:

// 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实例的文件中。

前缀与
api
无关

(非常)大致上看起来是这样的:

var api = require('./server/routes/api');
app.use('/api', 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;
};
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')(io);
app.use('/api', api);
var api = require('./server/routes/api');
app.use('/api', api.init(io));
您不需要仅在模块级别公开该函数,例如,您可以公开
init
函数,就像普通模块公开函数一样:

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;
};
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')(io);
app.use('/api', api);
var api = require('./server/routes/api');
app.use('/api', api.init(io));

我不喜欢任何可以测试的东西,但简单的解释是,您希望公开一个接受
io
变量的函数。在该函数中,
io
是您传入的任何内容。

有多种方法,包括导出接受参数的init函数、仅导出接受参数的函数等。如果您有时间,请举个例子。我曾考虑导出函数,但后来我不知道如何仍然应用
/api
前缀