Node.js初学者求教~~大家都在用Express什么版本?

Node.js初学者求教~~大家都在用Express什么版本?

话说Express3.x 跟 Express4.x 的变动也真大啊~~ Express4 的中间件全被独立出来,很多网上的Express3代码都没法用,真是操蛋啊~~

该用哪个版本呢?

是这样,有个PHP做的网站,需要实现实时聊天功能,准备用socket.io + express 做,现在安装的是Express4版本,需要用到 session 功能,可发现网上大多数代码都还是Express3版本的~~

理论上 Express4 版本应该架构更好,可要如何实现跟 socket.io 的session 连接呢? 一头雾水啊~~求大牛赐教,谢谢~~


7 回复

Node.js初学者求教~~大家都在用Express什么版本?

大家好,我最近在学习Node.js,并且想为一个现有的PHP网站添加实时聊天功能。目前我的计划是使用socket.ioexpress来实现这一功能。不过,我发现关于Express的版本选择上存在一些困惑。

Express版本选择

首先,让我们来看看Express的不同版本:

  • Express 3.x:这是一个相对稳定的版本,大多数在线教程和文档都是基于这个版本编写的。
  • Express 4.x:这个版本对中间件系统进行了重构,使得中间件变得更加模块化,但这也导致了与Express 3.x代码的不兼容性。

为什么选择Express 4.x?

Express 4.x 的设计更加现代化,支持更多的特性,并且架构更清晰。因此,从长远来看,建议选择Express 4.x版本。但是,由于Express 4.x引入了一些重大的变化,你需要确保你的代码能够适应这些变化。

如何在Express 4.x中实现Session功能?

在Express 4.x中,你可以使用express-session中间件来处理会话管理。下面是一个简单的示例代码:

const express = require('express');
const session = require('express-session');
const app = express();

// 配置express-session中间件
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true
}));

app.get('/', (req, res) => {
    if (req.session.views) {
        req.session.views++;
        res.write(`<p>Views: ${req.session.views}</p>`);
    } else {
        req.session.views = 1;
        res.write('<p>Welcome to the page!</p>');
    }
    res.end();
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个示例中,我们配置了一个简单的会话中间件,并在根路径上增加了一个视图计数器。每次访问根路径时,会话中的views属性都会递增。

如何集成Socket.IO和Session?

为了将socket.io与Express 4.x的会话管理结合使用,你需要在连接到Socket.IO时传递会话信息。这里有一个简单的示例:

const io = require('socket.io')(server);
const RedisStore = require('connect-redis')(session);

io.use((socket, next) => {
    const handshakeData = socket.request;
    session(handshakeData, {}, next);
});

io.on('connection', (socket) => {
    socket.on('chat message', (msg) => {
        console.log('message: ' + msg);
    });
});

在这个示例中,我们使用io.use方法来拦截每个Socket.IO连接,并从中提取会话信息。这样,你就可以在Socket.IO事件处理程序中访问到当前用户的会话数据。

希望这些示例和解释能帮助你更好地理解如何在Express 4.x中使用会话管理和集成Socket.IO。如果你有任何疑问或需要进一步的帮助,请随时提问!


开始入门的时候,就学的3.x,现在也一直在用3.x,等什么时候有时间了,再去研究研究4.x。 我的建议:用3.x。因为教程多,用的人也最多,出现问题,容易解决。

官方文档有,中间件独立了,session有中间件express-session。

一开始 不建议学框架,

用 4 吧

用4.2.0(目前最新版)的飘过

对于这个问题,Express 4.x 和 3.x 确实有很大的不同。Express 4.x 将中间件分离出来,导致一些旧的代码不再适用。如果你需要使用 socket.io 并且需要 session 功能,建议使用 Express 4.x 版本。

首先,你需要确保安装了正确的版本:

npm install express@4.17.1 socket.io@2.3.0

接下来,我们来看一个简单的示例代码,演示如何在 Express 4.x 中实现 socket.iosession 功能。

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const session = require('express-session');
const MemoryStore = require('memorystore')(session);

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

app.use(session({
    store: new MemoryStore({ checkPeriod: 86400000 }), // 每天检查一次
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: true
}));

io.use((socket, next) => {
    const handshakeData = socket.request;
    const sessionID = handshakeData.cookies[socket.request.session.cookie.name];
    if (!sessionID) {
        return next(new Error('No session ID found'));
    }
    handshakeData.sessionID = sessionID;
    next();
});

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

    socket.on('disconnect', () => {
        console.log('User disconnected');
    });

    socket.on('chat message', (msg) => {
        console.log('Message: ', msg);
        io.emit('chat message', msg);
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个例子中,我们使用了 express-session 来管理会话,并在 socket.io 中间件中获取会话信息。这样就可以在实时通信中使用会话数据了。

总结一下:

  • 使用 Express 4.x 和 socket.io 2.x。
  • 使用 express-session 管理会话。
  • socket.io 中间件中处理会话数据。

希望这能帮助你解决你的问题!

回到顶部