Node.js评论时如何获取登录用户名?是否需用Session Storage?
不需要使用Session Storage,基于现有JWT即可实现需求
你当前的登录逻辑已经采用了JWT(JSON Web Token)进行身份认证,完全不需要依赖Session Storage来实现评论时获取当前用户信息的功能。以下是具体实现步骤:
1. 完善登录接口,返回JWT给前端
当前登录代码中已生成JWT,但未返回给前端。修改登录接口,验证成功后将token和必要用户信息返回:
const admin = await loginData.findOne({ where: { email } }); if (admin && (await bcrypt.compare(password, admin.password))) { const token = jwt.sign( { admin_id: admin._id, email, username: admin.username }, // 直接将用户名签入JWT process.env.TOKEN_KEY, { expiresIn: "365d", } ); admin.token = token; // 返回token和用户信息给前端 return res.status(200).json({ token, username: admin.username }); } // 登录失败逻辑 return res.status(401).send("邮箱或密码错误");
2. 编写JWT验证中间件
创建中间件解析请求头中的JWT,验证有效性后将用户信息挂载到req对象:
const jwt = require('jsonwebtoken'); const authenticateToken = (req, res, next) => { // 从Authorization头提取token(格式为Bearer <token>) const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (!token) { return res.status(401).send("请先登录"); } jwt.verify(token, process.env.TOKEN_KEY, (err, user) => { if (err) { return res.status(403).send("无效的登录凭证"); } // 将解析后的用户信息挂载到req.user req.user = user; next(); }); };
3. 为评论接口添加认证中间件
在评论API的路由中加入中间件,确保只有已登录用户才能提交评论:
// 示例路由配置,添加authenticateToken中间件 app.post('/comments/:id', authenticateToken, async (req, res) => { // 原评论接口逻辑 });
4. 修改评论接口,关联当前登录用户
通过req.user获取当前用户信息,将其关联到评论记录:
try { const { comment } = req.body; const stageComment = await initCommentModel(); const id = req.params.id; // 从req.user提取当前用户信息 const { admin_id, username } = req.user; // 创建评论时存入用户ID和用户名 await stageComment.create({ comment: comment, stage_id: id, admin_id: admin_id, username: username // 若评论表未设username字段,可只存admin_id,后续通过关联查询获取用户名 }); return res.send("SUCCESS"); } catch (err) { return res.send(err.stack); }
补充说明
Session Storage是浏览器端本地存储方案,用于前端临时保存会话数据,但你的后端已采用JWT无状态认证,无需维护Session存储。前端只需将登录获取的JWT存入localStorage或Session Storage,后续请求评论接口时,在请求头Authorization字段中带上Bearer <token>即可。
内容的提问来源于stack exchange,提问作者sumanth.js
相关产品推荐
相关产品推荐

