一直专心于写代码,遇到问题便看别人的博客来解决问题,突然感觉自己也应该写点东西帮助别人来解决问题。废话不多说了,直接切入正题~
最近在写一个聊天室来学习node和socket相关知识。遇到的问题描述:ajax请求可以通过express-session来parse出目前用户,但socket请求我也想验证是否是登录用户,这个怎么做呢?
这个问题我在网上查了很多资料,大多都写的非常复杂,后来经自己实践,其实只需要给io加一个跟express用的中间件一样就可以了,能parse出来完全一样的user。一行代码胜过千言万语。附上两个middleware的代码(路径自行调整):
本例使用mongodb存储session, 使用到了connect-mongodb-session插件。
1. ajax用的中间件
var session = require('express-session'); var MongoDBStore = require('connect-mongodb-session')(session); var dbSettings = require('../db/settings'); module.exports = session({ secret: dbSettings.COOKIE_SECRET, cookie: { maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week }, store: new MongoDBStore({ uri: `mongodb://${dbSettings.HOST}:${dbSettings.PORT}/${dbSettings.DB}`, collection: 'mySessions' }), // Boilerplate options, see: // * https://www.npmjs.com/package/express-session#resave // * https://www.npmjs.com/package/express-session#saveuninitialized resave: true, saveUninitialized: true });
引用该中间件方式(细节请自行补充):
var app = express(); var sessionMiddleware = require('./middleware/sessionMiddleware'); app.use(sessionMiddleware);
2. io用的中间件
var sessionMiddleware = require('./sessionMiddleware'); module.exports = function(socket, next) { sessionMiddleware(socket.handshake, {}, next); };
引用该中间件方式:
var socketIO = require('socket.io'); var ioSessionMiddleware = require('../middleware/ioSessionMiddleware'); var ioServer = socketIO(server); ioServer.use(ioSessionMiddleware); ioServer.on('connection', function(socket) { let session = socket.handshake.session; }