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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:37:59