【问题标题】:Error: Can't set headers after they are sent Node.js and ExpressJS错误:发送 Node.js 和 ExpressJS 后无法设置标头
【发布时间】:2017-10-17 06:09:26
【问题描述】:

我正在使用 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) => {

设置重定向代码

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

设置渲染代码

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

    next();
  };
};

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

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

    很难通过您向我们展示代码的方式来判断,但您似乎正在重定向到选项,然后在同一个请求中您正在重定向到仪表板/it/model

    【讨论】:

    • 没有重定向到选项,您看到的是选项是setRedirect({auth: '/login'}), 中的值,所以重定向是“登录”,但只有在用户未登录的情况下。我尝试评论走出那条线并得到一个新的错误。 Path must be a string. Received undefined
    • 如果用户已经登录,那么你只需调用 next() 并进入下一个中间件,然后在请求结束时,当你完成你必须做的事情时,你做重定向。无用户登录时只需要重定向,有用户时无需重定向,继续请求即可
    • 好的,所以注释掉该行会给我错误Path must be a string. Received undefined 与 OP 中的错误如此不同。那么我该如何调试/解决该错误。
    • 我以前从未使用过中间件响应程序,但它说它只将重定向附加到请求对象。您可以从 setRedirect 中删除代码,仅使用 isAuthenticated 中间件中的重定向,或者在您完成任何您必须做的事情之后使用。或者只是删除 setRedirect 中间件,如果未通过身份验证,则直接从 isAuthenticated 重定向到 /login
    • 我通过删除最后一个重定向让它工作。我无法删除第一个并让它工作,但删除最后一个修复了它。我只是不停地评论和取消注释代码,直到它可悲地没有太多逻辑。
    【解决方案2】:

    我从 github 提取您的代码。 我认为错误信息很清楚。在您的 getDefault() 中间件中,您正在呈现响应,因此服务器开始向您的客户端发送数据,并且在您尝试将他重定向到另一个 url 之后。这就是为什么当您注释掉该中间件时都可以正常工作的原因。

    【讨论】:

    • 我通过删除第二个渲染让它消失了。它仍然可以保存,一切都很好。我还没有发布答案,因为我希望有人能告诉我一个解决方案来解决我的一些其他相关错误。
    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2015-09-08
    • 2019-04-22
    • 1970-01-01
    • 2012-07-25
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多