Nodejs socket.io在express中,怎么把io传到routes/index.js里去?

Nodejs socket.io在express中,怎么把io传到routes/index.js里去?

这是app里的

var server = http.createServer(app);

var socket = io.listen(server);

server.listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));
});
socket.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('message', function (data) {
        console.log(data);
    });

//断开连接callback
socket.on('disconnect', function () {
    console.log('Server has disconnected');
});
});

这是routes下的index.js

/*
* GET home page.
*/

exports.index = function (req, res) {

    res.render('index', { title: 'Express' });
};

7 回复

为了将 socket.io 的实例 io 传递到 routes/index.js 中,你需要确保在 Express 应用启动时创建 io 实例,并将其作为全局变量或通过其他方式传递给路由处理函数。以下是一个简单的示例,展示如何实现这一点:

app.js 中创建并导出 io

首先,修改 app.js 文件,创建 io 实例并导出它。

// app.js
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const path = require('path');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

// 导出 io 实例
module.exports = { app, server, io };

server.listen(app.get('port'), () => {
    console.log(`Express server listening on port ${app.get('port')}`);
});

io.on('connection', (socket) => {
    console.log('A user connected');

    socket.emit('news', { hello: 'world' });
    socket.on('message', (data) => {
        console.log(data);
    });

    // 断开连接回调
    socket.on('disconnect', () => {
        console.log('User disconnected');
    });
});

routes/index.js 中使用 io

接下来,在 routes/index.js 中导入 io 并使用它。

// routes/index.js
const express = require('express');
const router = express.Router();

// 导入 io 实例
const { io } = require('../app');

router.get('/', (req, res) => {
    // 将 io 实例传递给模板
    res.render('index', { title: 'Express', io });
});

module.exports = router;

在模板中使用 io

最后,在你的 EJS 模板文件(例如 views/index.ejs)中使用 io 实例来设置客户端的 Socket.IO 连接。

<!-- views/index.ejs -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %></title>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const io = <%= io %>;
        const socket = io.connect();

        socket.on('news', (data) => {
            console.log(data);
            socket.emit('my other event', { my: 'data' });
        });
    </script>
</head>
<body>
    <h1>Welcome to the Express App</h1>
</body>
</html>

通过这种方式,你可以将 socket.ioio 实例从服务器端传递到客户端,并在客户端建立 WebSocket 连接。


客户端js中

var socket = io.connect();
socket.on('news', function (data) {
  console.log(data);
  socket.emit('message', "hello ");
});

http://socket.io/#how-to-use

不是指客户端,是index.js文件,

现在socket都写在app.js里面,我想写在index.js文件里。

app.js

require(routes/index.js)(socket);

index.js

exports.index = function (socket) {

};

var express = require('express')
  , io = require('socket.io')
  , routes = require('./routes')
  , http = require('http')
  , user = require('./routes/user')
  , path = require('path')
  , partials = require('express-partials');
var app = express();


// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(partials());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);
app.get('/users/:id?', user.list);

var server = http.createServer(app);

var socket = io.listen(server);

server.listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));
});


socket.on('connection', function (socket) {
    socket.emit('system', { msg: '欢迎来到聊天室!' });
    socket.on('message', function (data) {
        console.log(data);
    });

    //断开连接callback
    socket.on('disconnect', function () {
        console.log('Server has disconnected');
    });
});

require(routes/index.js)(socket);写哪里?

要在Express应用中将io对象传递给routes/index.js文件,你可以通过将io对象作为参数传递给路由处理函数或将其挂载到全局对象上。以下是两种方法的示例:

方法一:通过参数传递

  1. 修改app.js

    在创建服务器并启动后,将io对象保存到一个全局变量或直接传递给路由模块。

    var express = require('express');
    var app = express();
    var http = require('http').createServer(app);
    var io = require('socket.io')(http);
    
    app.set('port', process.env.PORT || 3000);
    
    io.on('connection', function(socket) {
        socket.emit('news', { hello: 'world' });
        socket.on('message', function(data) {
            console.log(data);
        });
        socket.on('disconnect', function() {
            console.log('Server has disconnected');
        });
    });
    
    http.listen(app.get('port'), function() {
        console.log('Express server listening on port ' + app.get('port'));
    });
    
    // 导出路由时传递io
    var routes = require('./routes/index')(io);
    
  2. 修改routes/index.js

    修改路由文件以接受io参数。

    module.exports = function(io) {
        var express = require('express');
        var router = express.Router();
    
        /* GET home page. */
        router.get('/', function(req, res, next) {
            res.render('index', { title: 'Express' });
            // 可以在这里使用io对象
            // io.emit('some-event', { message: 'Hello from route' });
        });
    
        return router;
    };
    

方法二:通过中间件挂载全局变量

  1. 修改app.js

    创建一个中间件,在请求处理之前将io对象挂载到全局变量上。

    var express = require('express');
    var app = express();
    var http = require('http').createServer(app);
    var io = require('socket.io')(http);
    
    app.set('port', process.env.PORT || 3000);
    
    io.on('connection', function(socket) {
        socket.emit('news', { hello: 'world' });
        socket.on('message', function(data) {
            console.log(data);
        });
        socket.on('disconnect', function() {
            console.log('Server has disconnected');
        });
    });
    
    http.listen(app.get('port'), function() {
        console.log('Express server listening on port ' + app.get('port'));
    });
    
    // 使用中间件挂载io到全局
    app.use(function(req, res, next) {
        req.io = io;
        next();
    });
    
    var routes = require('./routes/index');
    app.use('/', routes);
    
  2. 修改routes/index.js

    现在可以在路由处理函数中访问req.io

    var express = require('express');
    var router = express.Router();
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
        res.render('index', { title: 'Express' });
        // 使用req.io
        // req.io.emit('some-event', { message: 'Hello from route' });
    });
    
    module.exports = router;
    

这两种方法都可以有效地将io对象传递到路由模块中。选择哪种方法取决于你的具体需求和偏好。

回到顶部