node.js 出现问题Can't set headers after they are sent

exports.detail = (req, res) => {

  Ques.find({_id: req.params.id})
    .exec((err, questions) => {
      if (err) next (err);
      res.render('pages/sub/detail', {questions: questions});
    });
    
  // 获取评论的内容
  Comment.find({topicId: req.params.id})
    .exec((err, comments) => {
      if (err) next (err);
      console.log('评论的个数为:', comments.length);
      res.render('pages/sub/detail', {comments: comments});
    });
    
}

运行出现Can't set headers after they are sent, 原因大概是设置发送header两次吧, 应该怎修改呢

阅读 3k
1 个回答

没猜错的话 Ques.findComment.find 是两个异步操作吧?两个回调分别执行了,res.render 执行了两次。

如果是两个无关的请求,应该用两个路由去处理,前端发起两次请求。

如果希望处理一个请求,可以使用 Promise.all。前提是 QuesComment 都 Promise 化。

exports.detail = (req, res) => {
  // 假设两个函数都是 Promise
  Promise.all([
    Ques.find({ _id: req.params.id }), 
    Comment.find({ topicId: req.params.id })
  ])
  .then(result => {
    const [ question, comments ] = result;
    res.render('pages/sub/detail', { questions, comments });
  })
  .catch(err => next(err));
}

如果不想用 Promise,那么笨办法就是嵌套。不推荐这样做

exports.detail = (req, res) => {

  Ques.find({ _id: req.params.id })
    .exec((err, questions) => {
      if (err) next (err);
      
      // 获取评论的内容
      Comment.find({ topicId: req.params.id })
       .exec((err, comments) => {
         if (err) next (err);
         console.log('评论的个数为:', comments.length);
         res.render('pages/sub/detail', { questions, comments });
      });

    });  
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题