错误:在发送Node.js和ExpressJS后无法设置标头

时间:2017-10-16 20:41:02

标签: javascript node.js mongodb express mongoose

我正在使用Node.js和ExpressJS来保存猫鼬模型。我收到错误Error: Can't set headers after they are sent.我认为它与我的路线中与res.redirect("/dashboard/it/model");冲突的行setRedirect({auth: '/login'}),有关,setRedirect中的代码标有以下内容。 setRedirect来自名为middleware-responder的中间件,它作为我用来创建Stripe用户帐户的模板的一部分。据我所知,我不能删除它。我的GitHub repo我已经提交了所有非测试文件且相关的文件(没有不必要的视图,而不是已有的视图)

保存模型

if(type=="aps"){
      var newAccessPoint = {
          name: name,
          manufacturer: manufacturer,
          model: model,
          range: range, 
          bands: bands,
          channel: channel,
          poe: poe,
          notes: notes,
          signout: signout,
          author:author
        };
      // Create a new access point and save to DB
      AP.create(newAccessPoint, function(err, newlyCreated){
          if(err){
              console.log(err);
          } else {
              //redirect back to models page
              res.redirect("/dashboard/it/model");
          }
      });
    }

路线

app.post('/dashboard/it/model/new',
    setRender('dashboard/it/modelCreate'),
    setRedirect({auth: '/login'}),
    isAuthenticated,
    dashboard.getDefault,
   (req, res) => {

setRedirect代码

exports.setRedirect = function(options){
  return function(req, res, next){
   if(req.redirect){
     req.redirect = _.merge(req.redirect, options);
   } else {
     req.redirect = options;
   }
   next();
 };
};

setRender代码

exports.setRender = function(view){
  return function(req, res, next){
    req.render = view;

    next();
  };
};

2 个答案:

答案 0 :(得分:0)

发生这种情况是因为您在关闭连接时尝试向客户端发送响应。

很难说您向我们显示您的代码的方式,但似乎您正在重定向到选项,然后在同一请求中您将重定向到仪表板/它/模型

答案 1 :(得分:0)

我从github中提取你的代码。 我认为错误信息很明确。在您的getDefault()中间件中,您正在呈现响应,因此服务器开始向您的客户端发送数据,并在您尝试将其重定向到另一个网址后。这就是为什么当你的评论中间件都很好地工作时。