Express应用中如何从JWT获取用户名并关联订单归属?
如何从JWT令牌中获取用户信息填充订单的user_name字段?
你好!其实你的问题很容易解决——因为你已经通过checkAuth中间件完成了JWT的验证和解码,并且中间件已经把解码后的用户数据挂载到了req.userData对象上,所以直接从这里取用户名赋值给user_name就可以了。
关键前提
首先要确认你签发JWT令牌的时候,已经把用户的用户名(或者你需要的用户标识)包含进了令牌的payload里。比如你签发令牌的代码应该类似这样:
// 示例:签发JWT时包含用户名 const token = jwt.sign( { username: user.username, // 这里的字段名要和你后续取用的一致 userId: user._id }, secretjwt, { expiresIn: "1h" } );
修改你的订单POST接口
接下来只需要在创建Order实例时,把user_name赋值为req.userData.username(注意字段名要和你签发JWT时的payload字段完全匹配):
router.post('/newOrder', checkAuth, (req,res,next) => { var order = new Order({ _id: new mongoose.Types.ObjectId(), // 别忘了给_id赋值,你的Schema里定义了这个字段 quantity: req.body.quantity, product: req.body.productId, user_name: req.userData.username // 这里就是从解码后的JWT数据中获取用户名 }); order.save() .then(result => { res.status(201).json({ // 用201表示资源创建成功更符合HTTP规范 message: "订单创建成功", order: result }); }) .catch(err => { res.status(400).json({ // 原代码返回200不合适,应该用400表示客户端请求错误 error: "创建订单失败", details: err.message }); }); });
额外优化建议
我还想给你提个实用的优化点:
- 建议在Order模型里存储用户ID而不是用户名,因为用户名可能会被修改,而用户ID是MongoDB中唯一且不变的标识。你可以把Order Schema里的
user_name改成:
然后赋值的时候用user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }req.userData.userId,这样后续查询订单时还能通过populate('user')关联查询用户的完整信息,比存用户名更灵活可靠。
内容的提问来源于stack exchange,提问作者user8426874
相关产品推荐
相关产品推荐

