Expressjs 4路由分离

Expressjs 4 route separation

本文关键字:分离 路由 Expressjs      更新时间:2023-09-26

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

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

// 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));

或者你可以把你的插座。在任何需要套接字的文件中设置require()。io实例。

api前缀不相关

(Very)大致是这样的:

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

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