You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MERN应用中通过Passport JWT将旅行日志关联到用户

实现旅行日志与用户的双向关联

核心逻辑

用户创建旅行日志时,需要同步完成两个数据库操作:

  1. 生成关联当前登录用户的旅行日志文档
  2. 将该日志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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:40:02