如何将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
相关产品推荐
相关产品推荐

