您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在expressjs路由中而不是在主server.js文件中使用socket.io

在expressjs路由中而不是在主server.js文件中使用socket.io

io与路由文件共享变量有多种方法

当您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);
其他 2022/1/1 18:14:52 有593人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶