Node.js+MongoDB从JWT令牌获取当前用户ID查询课程列表
解决从JWT令牌获取用户ID并查询课程列表的问题
步骤1:安装JWT相关依赖
先确保项目里安装了jsonwebtoken和express-jwt,后者能快速实现JWT验证的中间件功能:
npm install jsonwebtoken express-jwt
步骤2:编写JWT验证中间件
新建一个中间件文件(比如authMiddleware.js),用来解析请求头里的JWT令牌,并把用户信息挂载到请求对象上:
const expressJwt = require('express-jwt'); // 这里的密钥要和你签发JWT时用的完全一致 const SECRET_KEY = 'your-actual-secret-key'; // 中间件:验证令牌并解析用户信息到req.user const authenticateToken = expressJwt({ secret: SECRET_KEY, algorithms: ['HS256'], requestProperty: 'user' }); module.exports = authenticateToken;
步骤3:修改路由,获取用户ID并查询课程
在你的路由文件中引入中间件,通过中间件验证后,直接从req.user中拿到用户ID进行查询:
const express = require('express'); const router = express.Router(); const Course = require('../models/Course'); // 替换成你的Course模型路径 const authenticateToken = require('../middleware/authMiddleware'); const { ObjectId } = require('mongoose').Types; // 用mongoose的ObjectId更方便 router.get('/courses/courses-list', authenticateToken, async (req, res) => { try { // 从解析后的用户信息中取ID,注意字段名要和签发JWT时存的一致 const userId = req.user.id; const coursesList = await Course.find({ user: ObjectId(userId) }); res.status(200).json({ data: coursesList }); } catch (err) { res.status(500).json({ message: '获取课程列表失败', error: err.message }); } }); module.exports = router;
重要注意事项
- 前端请求时,必须在请求头里携带
Authorization字段,格式为Bearer <你的JWT令牌>,示例:Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... - 签发JWT时,要确保把用户ID存入payload,比如:
const jwt = require('jsonwebtoken'); const token = jwt.sign({ id: user._id }, SECRET_KEY, { expiresIn: '24h' });
内容的提问来源于stack exchange,提问作者Ismail Muhammad
相关产品推荐
相关产品推荐

