如何在MERN应用中通过Passport JWT将旅行日志关联到用户
实现旅行日志与用户的双向关联
核心逻辑
用户创建旅行日志时,需要同步完成两个数据库操作:
- 生成关联当前登录用户的旅行日志文档
- 将该日志ID追加到对应用户文档的
travelLogs数组中
具体实现步骤
1. 获取当前登录用户ID
由于采用Passport JWT验证,请求对象req会挂载已验证的用户信息,直接通过req.user._id即可获取当前用户的ID。
2. 编写创建日志的控制器代码
在日志控制器文件(如travelLogController.js)中实现核心逻辑:
const TravelLog = require('../models/TravelLog.model'); const User = require('../models/User.model'); // 创建旅行日志 exports.createTravelLog = async (req, res) => { try { // 组装日志数据,自动关联当前用户ID const logData = { ...req.body, user: req.user._id }; // 创建旅行日志文档 const newTravelLog = await TravelLog.create(logData); // 将新日志ID添加到用户的travelLogs数组 await User.findByIdAndUpdate( req.user._id, { $push: { travelLogs: newTravelLog._id } }, { new: true } // 可选:返回更新后的用户文档 ); // 返回创建成功的日志数据 res.status(201).json(newTravelLog); } catch (error) { res.status(500).json({ message: '创建旅行日志失败', error: error.message }); } };
3. 配置受保护的路由
确保创建日志的路由通过JWT验证中间件,仅允许登录用户访问:
const express = require('express'); const router = express.Router(); const travelLogController = require('../controllers/travelLogController'); const passport = require('passport'); // JWT验证保护路由 router.post( '/travel-logs', passport.authenticate('jwt', { session: false }), travelLogController.createTravelLog ); module.exports = router;
4. 可选:查询时关联数据
如需查询用户时返回其所有旅行日志,或查询日志时返回用户信息,可使用Mongoose的populate方法:
- 查询用户及关联日志:
const userWithLogs = await User.findById(userId).populate('travelLogs');
- 查询日志及所属用户(指定返回字段):
const logWithUser = await TravelLog.findById(logId).populate('user', 'name email');
注意事项
- 必须用
try/catch捕获异步操作异常,避免服务器崩溃 - 确认Passport JWT配置正确,保证
req.user能正常获取用户信息 - 使用
$push操作符而非直接修改数组,确保MongoDB操作的原子性
内容的提问来源于stack exchange,提问作者Anjay P.P
相关产品推荐
相关产品推荐

