错误:无法在将标头发送到客户端后设置标头

时间:2011-08-12 15:21:00

标签: javascript node.js express

我对Node.js很新,我遇到了一些问题。

我正在使用Node.js 4.10和Express 2.4.3。

当我尝试访问http://127.0.0.1:8888/auth/facebook时,我会被重定向到http://127.0.0.1:8888/auth/facebook_callback

然后我收到以下错误:

Error: Can't render headers after they are sent to the client.
    at ServerResponse.<anonymous> (http.js:573:11)
    at ServerResponse._renderHeaders (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:64:25)
    at ServerResponse.writeHead (http.js:813:20)
    at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:28:15
    at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:113:13
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/strategyExecutor.js:45:39)
    at [object Object].pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:32:3)
    at [object Object].halt (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:29:8)
    at [object Object].redirect (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:16:8)
    at [object Object].<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:77:15)
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:195:11)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
    at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
    at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
    at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
    at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
    at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
    at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
    at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
    at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
    at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
    at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
    at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
    at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
    at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
    at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
    at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
    at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
    at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
    at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
    at Array.<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session/memory.js:57:7)
    at EventEmitter._tickCallback (node.js:126:26)

以下是我的代码:

var fbId= "XXX";
var fbSecret= "XXXXXX";
var fbCallbackAddress= "http://127.0.0.1:8888/auth/facebook_callback"

var cookieSecret = "node";     // enter a random hash for security

var express= require('express');
var auth = require('connect-auth')
var app = express.createServer();


app.configure(function(){
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session({secret: cookieSecret}));
    app.use(auth([
        auth.Facebook({
            appId : fbId,
            appSecret: fbSecret,
            callback: fbCallbackAddress,
            scope: 'offline_access,email,user_about_me,user_activities,manage_pages,publish_stream',
            failedUri: '/noauth'
        })
    ]));
    app.use(app.router);
});


app.get('/auth/facebook', function(req, res) {
  req.authenticate("facebook", function(error, authenticated) {
    if (authenticated) {
      res.redirect("/great");
      console.log("ok cool.");
      console.log(res['req']['session']);
    }
  });
});

app.get('/noauth', function(req, res) {
  console.log('Authentication Failed');
  res.send('Authentication Failed');
});

app.get('/great', function( req, res) {
  res.send('Supercoolstuff');
});

app.listen(8888);

我可以知道我的代码有什么问题吗?

35 个答案:

答案 0 :(得分:883)

Express中的res对象是Node.js's http.ServerResponseread the http.js source)的子类。您可以根据需要随时拨打res.setHeader(name, value),直到您拨打res.writeHead(statusCode)。在writeHead之后,标题会被烘焙,您只能调用res.write(data),最后调用res.end(data)

错误“错误:发送后无法设置标头。”表示您已处于Body或Finished状态,但某些函数尝试设置标题或statusCode。当您看到此错误时,尝试查找在已经写入某些正文后尝试发送标头的任何内容。例如,查找意外调用两次的回调,或发送正文后发生的任何错误。

在您的情况下,您调用了res.redirect(),这导致响应完成。然后你的代码抛出了一个错误(res.reqnull)。并且由于错误发生在您的实际function(req, res, next)内(不在回调中),Connect能够捕获它,然后尝试发送500错误页面。但由于标题已经发送,Node.js的setHeader抛出了你看到的错误。

Node.js / Express响应方法的完整列表以及何时必须调用它们:

响应必须位于 Head 并保留在 Head 中:

  1. res.writeContinue()
  2. res.statusCode = 404
  3. res.setHeader(name, value)
  4. res.getHeader(name)
  5. res.removeHeader(name)
  6. res.header(key[, val])(仅限快递)
  7. res.charset = 'utf-8'(仅限Express;仅影响特定于Express的方法)
  8. res.contentType(type)(仅限快递)
  9. 响应必须位于 Head 并变为正文

    1. res.writeHead(statusCode, [reasonPhrase], [headers])
    2. 响应可以是头部/身体,并保留在正文中:

      1. res.write(chunk, encoding='utf8')
      2. 响应可以是头部/身体,并且变为已完成

        1. res.end([data], [encoding])
        2. 响应可以是头部/身体,并保持其当前状态:

          1. res.addTrailers(headers)
          2. 响应必须位于并变为已完成

            1. return next([err])(仅限连接/快速)
            2. 中间件function(req, res, next)(仅限Connect / Express)
            3. 中的任何例外情况
            4. res.send(body|status[, headers|status[, status]])(仅限快递)
            5. res.attachment(filename)(仅限快递)
            6. res.sendfile(path[, options[, callback]])(仅限快递)
            7. res.json(obj[, headers|status[, status]])(仅限快递)
            8. res.redirect(url[, status])(仅限快递)
            9. res.cookie(name, val[, options])(仅限快递)
            10. res.clearCookie(name[, options])(仅限快递)
            11. res.render(view[, options[, fn]])(仅限快递)
            12. res.partial(view[, options])(仅限快递)

答案 1 :(得分:85)

我也遇到了这个错误。我想(希望)我已经把它包围了,想把它写在这里作为参考。

当您使用app.use方法将中间件添加到connectexpress(基于连接构建)时,您会在连接中将项目附加到Server.prototype.stack(At至少使用当前npm install connect,这看起来与本文中的一个github完全不同)。当服务器获取请求时,它会遍历堆栈,调用(request, response, next)方法。

问题是,如果其中一个中间件项目写入响应正文或标题(看起来它是/或由于某种原因),但不会调用response.end()并且您调用next() 然后当核心Server.prototype.handle方法完成时,它会注意到:

  1. 堆叠中没有其他项目和/或
  2. response.headerSent是真的。
  3. 所以,它会抛出一个错误。但它抛出的错误就是这个基本响应(来自connect http.js源代码:

    res.statusCode = 404;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Cannot ' + req.method + ' ' + req.url);
    

    就在那里,它正在调用res.setHeader('Content-Type', 'text/plain');,您可能已经在render方法中设置了而没有调用response.end(),例如:

    response.setHeader("Content-Type", "text/html");
    response.write("<p>Hello World</p>");
    

    所有需要构建的方式都是这样的:

    良好的中间件

    // middleware that does not modify the response body
    var doesNotModifyBody = function(request, response, next) {
      request.params = {
        a: "b"
      };
      // calls next because it hasn't modified the header
      next();
    };
    
    // middleware that modify the response body
    var doesModifyBody = function(request, response, next) {
      response.setHeader("Content-Type", "text/html");
      response.write("<p>Hello World</p>");
      response.end();
      // doesn't call next()
    };
    
    app.use(doesNotModifyBody);
    app.use(doesModifyBody);
    

    有问题的中间件

    var problemMiddleware = function(request, response, next) {
      response.setHeader("Content-Type", "text/html");
      response.write("<p>Hello World</p>");
      next();
    };
    

    有问题的中间件设置响应标头而不调用response.end()并调用next(),这会混淆connect的服务器。

答案 2 :(得分:40)

我遇到了同样的问题并意识到这是因为我在没有res.redirect语句的情况下调用了return,所以之后也会立即调用next函数:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) res.redirect('/');
    next();
};

应该是:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) return res.redirect('/');
    next();
};

答案 3 :(得分:34)

很多人都遇到了这个错误。这与异步处理相比令人困惑。很可能你的一些代码是在第一个tick中设置头文件,然后你在将来的tick中运行异步回调。在这两者之间,响应头被发送,但随后进一步的头(如30X重定向)尝试添加额外的头,但是由于响应头已经被传输,所以为时已晚。

我不确定究竟是什么导致了您的错误,但请将任何回调视为潜在的调查范围。

简化代码的一个简单提示。摆脱app.configure()并直接在您的顶级范围内致电app.use

另请参阅everyauth模块,其中包含Facebook和十几个其他第三方身份验证提供程序。

答案 4 :(得分:28)

本Q&amp; A中的一些答案是错误的。接受的答案也不是很实用&#34;所以我想发布一个用简单的术语解释事情的答案。我的答案将涵盖我一遍又一遍地发布的99%的错误。有关错误背后的实际原因,请查看已接受的答案。

HTTP使用一个循环,每个请求需要一个响应。当客户端发送请求(例如POST或GET)时,服务器应该只发回一个响应。

此错误消息:

  

错误:发送后无法设置标头。

通常在您为一个请求发送多个响应时发生。确保每个请求仅调用以下函数一次:

  • res.json()
  • res.send()
  • res.redirect()
  • res.render()

(还有一些很少使用的,请查看接受的答案)

调用这些res函数时,不会返回路由回调。它将继续运行,直到它到达函数结束或返回语句。如果您想在发送回复时返回,可以这样做:return res.send()

以此代码为例:

app.post('/api/route1', function(req, res) {
  console.log('this ran');
  res.status(200).json({ message: 'ok' });
  console.log('this ran too');
  res.status(200).json({ message: 'ok' });
}

当POST请求发送到 / api / route1 时,它将运行回调中的每一行。 在发送后无法设置标头将抛出错误消息,因为res.json()被调用两次,这意味着会发送两个响应。

每个请求只能发送一个响应!

上面的代码示例中的错误是显而易见的。更典型的问题是当你有几个分支时:

app.get('/api/company/:companyId', function(req, res) {
  const { companyId } = req.params;
  Company.findById(companyId).exec((err, company) => {
      if (err) {
        res.status(500).json(err);
      } else if (!company) {
        res.status(404).json();      // This runs.
      }
      res.status(200).json(company); // This runs as well.
    });
}

此附加回调的路由会在数据库中找到公司。在对不存在的公司进行查询时,我们将进入else if分支并发送404响应。之后,我们将继续下一个也发送回复的声明。现在我们发送了两个响应,并将出现错误消息。我们可以通过确保只发送一个响应来修复此代码:

.exec((err, company) => {
  if (err) {
    res.status(500).json(err);
  } else if (!company) {
    res.status(404).json();         // Only this runs.
  } else {
    res.status(200).json(company);
  }
});

或在发送回复时返回:

.exec((err, company) => {
  if (err) {
    return res.status(500).json(err);
  } else if (!company) {
    return res.status(404).json();  // Only this runs.
  }
  return res.status(200).json(company);
});

一个大罪人是异步功能。从this问题中获取函数,例如:

article.save(function(err, doc1) {
  if (err) {
    res.send(err);
  } else {
    User.findOneAndUpdate({ _id: req.user._id }, { $push: { article: doc._id } })
    .exec(function(err, doc2) {
      if (err) res.send(err);
      else     res.json(doc2);  // Will be called second.
    })

    res.json(doc1);             // Will be called first.
  }
});

这里我们在代码示例中有一个异步函数(findOneAndUpdate())。如果没有错误(err),则会调用findOneAndUpdate()。由于此函数是异步的,因此将立即调用res.json(doc1)。假设findOneAndUpdate()中没有错误。然后将调用res.json(doc2)中的else。现在已发送了两个响应,并且无法设置标头错误消息。

在这种情况下,修复将删除res.json(doc1)。要将两个文档发送回客户端,其他内容中的res.json()可以写为res.json({ article: doc1, user: doc2 })

答案 5 :(得分:14)

我对这个问题大加赞赏,并且由于处理回调时出现了一个不小心的错误。非返回的回调导致响应被设置两次。!

我的程序有一个验证请求和查询数据库的代码。在验证错误是否存在之后,我正在使用验证错误回调index.js。 如果验证通过它继续并成功/失败击中数据库。

    var error = validateRequestDetails("create",queryReq);
    if (error)
        callback(error, null);
   else
    some code 
    callback(null, success);

发生的事情是:在调用回调get并设置响应时,Incase验证失败。但没有回来。所以它仍然继续该方法转到db并命中成功/失败。它再次调用相同的回调,导致响应现在设置两次。

所以解决方案很简单,你需要'返回'回调,这样一旦错误发生,方法就不会继续执行,因此设置响应对象一次

  var error = validateRequestDetails("create",queryReq);
    if (error)
        callback(error, null);
        return;
    else
       some code 
       callback(null, success);

答案 6 :(得分:13)

发送回复后传递语句时会出现此类错误。

例如:

res.send("something response");
console.log("jhgfjhgsdhgfsdf");
console.log("sdgsdfhdgfdhgsdf");
res.send("sopmething response");

会导致您看到的错误,因为一旦发送了响应,就不会执行以下res.send

如果你想做任何事情,你应该在发送回复之前这样做。

答案 7 :(得分:5)

有时当您尝试在 res.end res.send 之后调用next()函数时可能会出现此错误,如果您有next()则尝试删除在你的函数res.send或res.end之后。 注意:此处next()表示在使用您的响应(即res.send或res.end )回复客户端后,您仍在尝试执行某些代码以再次响应,因此它不合法。< / p>

示例:

router.get('/',function (req,res,next){
     res.send("request received");
     next(); // this will give you the above exception 
});
  

从上面的功能中移除next(),它会起作用。

答案 8 :(得分:3)

在我的情况下,当我没有取消订阅我的React组件的{{1}}回调中的频道时,这发生在React和postal.js上。

答案 9 :(得分:3)

在我的情况下,这是一个导致问题的304响应(缓存)。

最简单的解决方案:

app.disable('etag');

如果您想要更多控制权,请在此处替代解决方案:

http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/

答案 10 :(得分:3)

还有其他原因导致此错误,就是您没有在res.send,res.json等前面添加 return 关键字时

答案 11 :(得分:2)

只是倾向于此。您可以通过此功能传递回复:

app.use(function(req,res,next){
  var _send = res.send;
  var sent = false;
  res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
};
  next();
});

答案 12 :(得分:2)

添加此middlware,它将起作用

app.use(function(req,res,next){
 var _send = res.send;
var sent = false;
res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
};
next();
});

答案 13 :(得分:2)

当响应传递给客户端并且您再次尝试给出响应时,会发生这种情况。您必须检查您的代码,您正在返回的某个地方再次响应客户端,这会导致此错误。当您想要返回时,请检查并返回一次响应。

答案 14 :(得分:2)

对于任何人来说,其他解决方案都没有帮助,在我的情况下,这表现在处理图片上传但未处理 超时 的路线上,因此,如果上传时间太长而且超时,当在发送超时响应后触发回调时,调用res.send()导致崩溃,因为标题已经设置为帐户暂停。

通过设置一个非常短暂的超时并且用一个相当大的图像命中路线,这很容易再现。每次都会重现崩溃。

答案 15 :(得分:2)

我也遇到过猫鼬造成的同样问题。

修复必须启用Promises,以便可以在代码中添加:mongoose.Promise = global.Promise,从而可以使用native js promises

此解决方案的其他替代方法是:

var mongoose = require('mongoose');
// set Promise provider to bluebird
mongoose.Promise = require('bluebird');

// q
mongoose.Promise = require('q').Promise;

但是您需要先安装这些软件包。

答案 16 :(得分:2)

当您发送2个响应时,会发生此错误。例如:

if(condition A)
{ 

      res.render('Profile', {client:client_});

}

if (condition B){

      res.render('Profile', {client:client_});
    }
  }

想象一下,如果由于某种原因条件A和B为真,那么在第二个render中您将得到该错误

答案 17 :(得分:1)

问题出自 /auth/facebook 路由,以便于理解,一旦您已经从客户端发送了响应,则不得为下一个后继块设置以下任何其他功能,这也与与 JavaScript 同步,

为了深入理解,也就像;

async function getRequest(){
   let data = await API.get();
   return data;
   let json = data.json();
}

对于您的情况,console.log("ok cool.");console.log(res['req']['session']) 必须在 res.redirect(|/great") 之前

enter image description here

希望它有意义,欢迎:)

答案 18 :(得分:1)

当我尝试在循环函数中发送响应时,出现了类似的错误。简单的解决方案是移动

  

res.send('发送响应');

无需循环,因为您只能发送一次响应标头。

https://www.tutorialspoint.com/nodejs/nodejs_response_object.htm

答案 19 :(得分:1)

如果您使用回调函数,请在return块之后使用err。这是可能发生此错误的情况之一。

userModel.createUser(data, function(err, data) {
    if(err) {
      res.status = 422
      res.json(err)
      return // without this return the error can happen.
    }
    return res.json(data)
  })

在节点版本v10.16.0上进行了测试,并表示为4.16.4

答案 20 :(得分:1)

nuxt 来到这里,问题出在组件的asyncData方法中,我忘记了return承诺,它正在那里获取数据并设置标头。

答案 21 :(得分:0)

请检查您的代码是否针对单个请求返回多个res.send()语句。就像我遇到这个问题时一样。...

在我的Restify节点应用程序中就是这个问题。错误是

switch (status) { case -1: res.send(400); case 0: res.send(200); default: res.send(500); }

我正在使用开关处理各种情况,而没有写中断。对于那些不太熟悉switch情况的人来说,知道不间断地返回关键字。大小写及其下一行代码无论如何都将执行。因此,即使我要发送单个res.send,由于此错误,它仍会返回多个res.send语句,这提示了

  

错误在将标头发送到客户端后无法设置标头。通过在每个res.send()方法(例如return res.send(200))之前添加此代码或使用return可以解决该问题

switch (status) { case -1: res.send(400); break; case 0: res.send(200); break; default: res.send(500); break; }

答案 22 :(得分:0)

很有可能这更多的是节点问题,在99%的时间内,它是一个双重回调,导致您响应两次,或者两次next()响应等等,该死。它解决了我的问题是在循环内使用next()。从循环中删除next()或停止多次调用它。

答案 23 :(得分:0)

如果发生此错误,我所要做的就是res.end()。

 auth.annonymousOnly = function(req, res, next) {
 // add other task here   
   res.end();    
  };

您可能面临的另一个问题是在res.json和res之后有代码。写。在这种情况下,此后您需要使用return来停止执行。

 auth.annonymousOnly = function(req, res, next) {

  if(!req.body.name)
  {
    res.json({error:"some error"});
    return;
  }
  let comp = "value"; // this is the code after res.json which may cause some problems so you have to use return 
};

答案 24 :(得分:0)

就我而言,它是由于多个回调而发生的。我在代码中多次调用了next()方法

答案 25 :(得分:0)

我只需添加返回关键字,例如: return res.redirect("/great");和Walla!

答案 26 :(得分:0)

在RND之后错误发现自己:

1)我的错误代码:

return res.sendStatus(200).json({ data: result });

2)我的成功代码

return res.status(200).json({ data: result });

区别在于我使用了 sendStatus()而不是 status()

答案 27 :(得分:0)

我的问题是我运行了setInterval,它有一个if/else块,其中clearInterval方法位于else内:

      const dataExistsInterval = setInterval(async () => {
        const dataExists = Object.keys(req.body).length !== 0;
        if (dataExists) {
          if (!req.files.length) {
            return res.json({ msg: false });
          } else {
              clearInterval(dataExistsInterval);
            try {
            . . .

clearInterval放在if/else之前就可以了。

答案 28 :(得分:0)

当我嵌套承诺时,我遇到了这个问题。承诺中的承诺将返回200到服务器,但是外部承诺的catch语句将返回500.一旦我解决了这个问题,问题就消失了。

答案 29 :(得分:0)

就我而言,在循环中,我放了0,因此可能多次尝试调用。

答案 30 :(得分:0)

如果你从上面得到帮助:对于新手 这个错误背后的原因是多次发送请求让我们从某些情况了解: - 1.“

module.exports = (req,res,next)=>{
        try{
           const decoded  = jwt.verify(req.body.token,"secret");
           req.userData = decoded;
           next();
        }catch(error){
            return res.status(401).json({message:'Auth failed'});
        }
        next();   
        }

` 在上面调用next()两次会引发错误

  1. router.delete('/:orderId', (req, res, next) => { Order.remove({_id:req.params.orderId},(err,data)=>{ if(err){ **res.status(500).json(err);** }else{ res.status(200).json(data); } *res.status(200).json(data);* }) })
  2. 这里回复是两次发送检查你是否已发送回复

答案 31 :(得分:0)

Process.env不会更改,因此不得用于访问其值可能会随每个请求而变化的每个请求环境变量。 因此,如果用户产生了一个应用程序进程,但不是作为处理请求的一部分,则该应用程序进程将不会在OS级环境变量中存储每个请求的环境变量。 因此,使用此代码存储进程env,您的程序将成功运行。

    const port = process.env.PORT || 2000;
    
    app.listen(port,()=>{
        console.log("Server running at port 2000");
    })

答案 32 :(得分:0)

在我的情况下,当我不使针对 mongodb 架构运行的函数成为像这样的异步函数时,这种情况会反复出现 technicianAuthSchema.methods.matchPasswords = function(password) { return await bcrypt.compare( password, this.password ); }; 我得到这个 Logged error: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 而不是 technicianAuthSchema.methods.matchPasswords = async function(password) { return await bcrypt.compare( password, this.password ); };它是异步的,因为 this.password 来自此函数正在运行的对象,我们正在从数据库中提取该对象。

答案 33 :(得分:0)

检查您的代码。对我来说,我在同一个 if 语句中使用了 res.status 两次。第一个设置标题状态,第二个尝试更改它,导致问题。

答案 34 :(得分:0)

在Typescript中,我的问题是我在收到消息后没有关闭websocket连接。

WebSocket.on("message", (data) => {
    receivedMessage = true;
    doSomething(data);
    localSocket.close(); //This close the connection, allowing 
});