当您require()
在路由文件中时,将io
变量作为构造函数参数传递给它。
使用app.set("io", io)
,然后可以let io = app.get("io")
在可以访问该app
对象的任何文件中使用。
创建一个将io
对象放置在每个对象上的中间件,req
以便您可以随时从那里访问它。
let server = app.listen(3000);
let io = require('socket.io')(server);
// load other routers
app.use(require("./someRouterFile.js")(io));
// in someRouterFile.js
const express = require('express');
module.exports = function(io) {
let router = express.Router()
// define routes
// io is available in this scope
router.get(...)
return router;
}
这是该app.set()
方案的一个示例:
let server = app.listen(3000);
let io = require('socket.io')(server);
app.set("io", io);
然后,在您可以访问该app
对象的路线中的任何位置,都可以使用以下方法获取它:
let io = app.get("io");
这是一个使用中间件将io
对象设置到每个req
对象上以便可以在所有路由中使用的示例。
let server = app.listen(3000);
let io = require('socket.io')(server);
// place this middleware before any other route deFinitions
// makes io available as req.io in all request handlers
app.use(function(req, res, next) {
req.io = io;
next();
});
// then in any express route handler, you can use req.io.emit(...)
这是在不使用中间件的情况下对模块构造函数使用参数的示例:
// in mysocket.js
module.exports = (io) => {
console.log('IO: ', io);
io.on('connect', socket => {
// handle varIoUs socket connections here
});
// put any other code that wants to use the io variable
// in here
};
然后,在您的主文件中:
let server = app.listen(3000);
let io = require('socket.io')(server);
// initialize my socketio module and pass it the io instance
require('./mysocket.js')(io);