MERN栈中Mongoose新建推文不返回时间戳的无重查解决方法
解决新增推文接口返回时间戳的问题
嘿,你已经离解决问题很近了!因为你已经在tweetSchema里配置了{ timestamps: true },Mongoose会自动为每个推文文档添加createdAt和updatedAt字段——当前返回没有时间戳的核心原因是你没有等待tweet.save()异步操作完成就返回了对象,这时候Mongoose还没把自动生成的时间戳添加上去。
下面是修改后的代码,不需要重新查询数据库,只需要调整异步逻辑即可:
router.route('/new').post(async (req, res) => { const { errors, isValid } = validateTweet(req.body); if (!isValid) { return res.status(400).json(errors); } let tweet = new Tweet({ content: req.body.content, created_by: req.user.id }); // 等待推文保存完成,此时tweet会包含自动生成的timestamps try { const savedTweet = await tweet.save(); // 同时处理用户推文关联的异步操作(也建议用await避免竞态问题) const user = await User.findById(req.user.id); user.tweets.push(savedTweet._id); await user.save(); return res.status(201).json(savedTweet); } catch (err) { return res.status(400).json(err); } });
关键修改点:
- 将路由处理函数标记为
async,这样可以使用await关键字等待异步操作完成 - 用
await tweet.save()代替同步调用,保存完成后得到的savedTweet会包含Mongoose自动生成的createdAt和updatedAt时间戳字段 - 同时把用户关联的操作也改成
await,避免出现推文已经返回,但用户的tweets数组还没更新的竞态问题 - 增加
try/catch块来统一处理异步操作中的错误
这样修改后,你的接口返回的推文数据就会自带时间戳,而且完全不需要额外查询数据库,完美符合你的需求!
内容的提问来源于stack exchange,提问作者Eduardo Robles
相关产品推荐
相关产品推荐

