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

如何将Mongoose生成的userId作为clientId传入工单POST接口

问题根源

你的用户授权中间件已经成功获取到了当前登录用户的ID,但是没有将该ID挂载到请求对象req上,导致后续的工单路由无法获取到用户ID,因此req.User._id会返回undefined。


解决方案

1. 修改授权中间件(authorization.js)

在验证用户身份通过后,将用户ID挂载到req对象上传递给后续路由,同时补充处理JWT常用的Bearer前缀逻辑:

const userAuthorization = async(req,res,next) => {
    try {
        // 处理Authorization头的Bearer前缀
        let token = req.headers.authorization;
        token = token?.startsWith('Bearer ') ? token.slice(7, token.length) : token;

        const decoded = await verifyAccessJWT(token);
        if (decoded.email){
            const userId = await getJWT(token);
            if (!userId) {
                return res.status(403).json({message: "Forbidden"});
            }
            // 将用户ID挂载到req对象,后续路由可直接读取
            req.userId = userId;
            return next();
        }
        await deleteJWT(token);
        return res.status(403).json({ message: "forbidden" });
    } catch (error) {
        return res.status(403).json({ message: "forbidden" });
    }
};

2. 修改工单创建路由(Ticket.js)

直接读取授权中间件挂载的用户ID赋值给clientId字段:

router.post(
  "/",
  createNewTicketValidation,
  userAuthorization,
  async (req, res) => {
    try {
      const { subject, sender, message } = req.body;
      // 读取中间件挂载的用户ID
      const userId = req.userId;
      if (!userId) {
        return res.json({ status: "error", message: "用户身份校验失败" });
      }

      const ticketObj = {
        clientId: userId,
        subject,
        conversations: [
          {
            sender,
            message,
          },
        ],
      };

      // 若你的newTicket方法存在问题,可直接用mongoose内置方法创建工单:
      // const result = await TicketSchema.create(ticketObj);
      const result = await newTicket(ticketObj);

      if (result._id) {
        return res.json({
          status: "success",
          message: "New ticket has been created!",
        });
      }

      res.json({
        status: "error",
        message: "Unable to create the ticket , please try again later",
      });
    } catch (error) {
      res.json({ status: "error", message: error.message });
    }
  }
);

额外优化建议

  • 如果需要使用完整用户信息,可以在授权中间件中通过userId查询User表,将用户对象挂载到req.user,后续通过req.user._id获取ID即可
  • 生成JWT时确保存入的用户ID是标准的MongoDB ObjectId格式,mongoose会自动将字符串格式的合法ID转为ObjectId存入clientId字段

内容的提问来源于stack exchange,提问作者Karan Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:45:06