it-swarm.com.ru

Ошибка: невозможно установить заголовки после их отправки клиенту

Я довольно новичок в 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);

Могу ли я узнать, что не так с моим кодом?

516
DjangoRocks

Объект res в Express является подклассом кода http.ServerResponse ( чтения источника http.js ) в Node.js. Вам разрешается звонить res.setHeader(name, value) так часто, как вы хотите, пока вы не позвоните res.writeHead(statusCode). После writeHead заголовки запекаются, и вы можете вызывать только res.write(data) и, наконец, res.end(data).

Ошибка «Ошибка: невозможно установить заголовки после их отправки». означает, что вы уже в состоянии Body или Finished, но некоторые функции пытались установить заголовок или statusCode. Когда вы видите эту ошибку, попробуйте найти все, что пытается отправить заголовок после того, как часть тела уже написана. Например, ищите обратные вызовы, которые случайно вызываются дважды, или любую ошибку, которая происходит после отправки тела.

В вашем случае вы вызвали res.redirect(), что привело к завершению ответа. Затем ваш код выдал ошибку (res.req is null). и так как ошибка произошла в вашей фактической function(req, res, next) (не в обратном вызове), Connect смог ее перехватить и попытался отправить страницу с ошибкой 500. Но поскольку заголовки уже были отправлены, setHeader из Node.js выдал ошибку, которую вы видели.

Полный список методов ответа 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) (только экспресс)

Ответ должен быть в Head и становится Body:

  1. res.writeHead(statusCode, [reasonPhrase], [headers])

Ответ может находиться в Head/Body и оставаться в Body:

  1. res.write(chunk, encoding='utf8')

Ответ может быть в Head/Body и становится Finished:

  1. res.end([data], [encoding])

Ответ может находиться в Head/Body и оставаться в своем текущем состоянии:

  1. res.addTrailers(headers)

Ответ должен быть в Head и становится Finished:

  1. return next([err]) (только Connect/Express)
  2. Любые исключения в промежуточном программном обеспечении function(req, res, next) (только Connect/Express)
  3. res.send(body|status[, headers|status[, status]]) (только экспресс)
  4. res.attachment(filename) (только экспресс)
  5. res.sendfile(path[, options[, callback]]) (только экспресс)
  6. res.json(obj[, headers|status[, status]]) (только экспресс)
  7. res.redirect(url[, status]) (только экспресс)
  8. res.cookie(name, val[, options]) (только экспресс)
  9. res.clearCookie(name[, options]) (только экспресс)
  10. res.render(view[, options[, fn]]) (только экспресс)
  11. res.partial(view[, options]) (только экспресс)
840
yonran

Я тоже столкнулся с этой ошибкой некоторое время. Я думаю (надеюсь), что я обернул голову вокруг этого, хотел написать это здесь для справки.

Когда вы добавляете промежуточное программное обеспечение в connect или express (которое построено на connect) с помощью метода app.use, вы добавляете элементы в Server.prototype.stack в connect (по крайней мере, с текущим npm install connect, который выглядит совсем иначе один GitHub на этот пост). Когда сервер получает запрос, он перебирает стек, вызывая метод (request, response, next).

Проблема заключается в том, что если в одном из элементов промежуточного программного обеспечения выполняется запись в тело или заголовки ответа (похоже, это либо/или по какой-то причине), но не вызывается response.end() и вы вызываете next(), то в качестве основного Server.prototype.handle Метод завершается, он заметит, что:

  1. в стеке больше нет предметов и/или
  2. этот response.headerSent верный.

Итак, выдает ошибку. Но ошибка, которую он выдает, это просто базовый ответ (из исходного кода 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

// 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(), что приводит к путанице на сервере подключения.

80
Lance Pollard

У меня возникла та же проблема, и я понял, что это потому, что я вызывал 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();
};
37
ergusto

Многие люди попали в эту ошибку. Это путает с асинхронной обработкой. Скорее всего, часть вашего кода устанавливает заголовки в первом тике, а затем вы запускаете асинхронный обратный вызов в будущем. Между ними отправляется заголовок ответа, но затем дополнительные заголовки (например, перенаправление 30X) пытаются добавить дополнительные заголовки, но уже слишком поздно, поскольку заголовок ответа уже был передан.

Я не уверен точно, что является причиной вашей ошибки, но посмотрите на любые обратные вызовы как на возможные области для расследования.

Один простой совет, чтобы упростить ваш код. Избавьтесь от app.configure() и просто вызовите app.use прямо в области видимости верхнего уровня.

См. Также Everyauth модуль, который делает Facebook и дюжина или около того других сторонних поставщиков аутентификации.

32
Peter Lyons

Некоторые из ответов в этом Q & A неправильны. Принятый ответ также не очень «практичен», поэтому я хочу опубликовать ответ, который объясняет вещи в более простых терминах. Мой ответ покроет 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 question, например:

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 }).

22
MikaS

Я поднял голову над этой проблемой, и это произошло из-за неосторожной ошибки при обработке обратных вызовов. невозвращенные обратные вызовы приводят к тому, что ответ устанавливается дважды.!

Моя программа имела код, который проверяет запрос и запрашивает БД. после проверки, если есть ошибка, я перезванивал index.js с ошибками проверки. И если проверка прошла успешно, она идет вперед и поражает БД с успехом/неудачей. 

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

Происходило следующее: проверка Incase завершается неудачно, вызывается обратный вызов и устанавливается ответ. Но не вернулся. Таким образом, он все еще продолжается, метод переходит к БД и достигает успеха/неудачи. Он снова вызывает тот же обратный вызов, в результате чего ответ будет установлен дважды. 

Таким образом, решение простое, вам нужно «вернуть» обратный вызов, чтобы метод не продолжал выполняться после возникновения ошибки и, следовательно, один раз установить объект ответа. 

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

Этот тип ошибки вы получите при прохождении выписки после отправки ответа.

Например: 

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

Это приведет к появившейся ошибке, поскольку после отправки ответа следующий res.send не будет выполнен.

Если вы хотите что-то сделать, вы должны сделать это перед отправкой ответа.

13
Trojan

Иногда вы можете получить эту ошибку при попытке вызвать функцию next () после res.end или res.send , попытаться удалить, если у вас есть next () после res.send или res.end в ваша функция . Примечание: здесь next () означает, что после ответа клиенту своим ответом ( т.е. res.send или res.end ) вы все еще пытаетесь выполнить некоторый код, чтобы ответить снова, так что это не законны.

Пример : 

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

удалите функцию next() сверху, и она будет работать.

5
Surendra Parchuru

В моем случае это был ответ 304 (кеширование), который вызывал проблему. 

Самое простое решение:

app.disable('etag');

Альтернативное решение здесь, если вы хотите больше контроля:

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

3
blented

В моем случае это произошло с React и postal.js, когда я не отписался от канала в обратном вызове componentWillUnmount моего компонента React.

3
Zoltán

Просто наклонился к этому. Вы можете передать ответы через эту функцию:

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();
});
2
iMad

Для всех, кто подходит к этому, и ни одно из других решений не помогло, в моем случае это проявилось на маршруте, который обрабатывал загрузку изображений, но не обрабатывалtimeouts, и, следовательно, если загрузка заняла слишком много времени и истекло время ожидания, когда обратный вызов был запущен после того, как ответ на тайм-аут был отправлен, вызов res.send () привел к сбою, поскольку заголовки уже были настроены для учета времени ожидания.

Это было легко воспроизвести, установив очень короткий тайм-аут и выбрав маршрут с прилично большим изображением, авария воспроизводилась каждый раз.

2
Mike

Добавьте это промежуточное ПО, и оно будет работать

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();
});
2
ASHISH RANJAN

Это происходит, когда ответ был доставлен клиенту, и вы снова пытаетесь дать ответ. Вы должны проверить в своем коде, что где-то вы снова возвращаете ответ клиенту, который вызывает эту ошибку. Проверьте и верните ответ один раз, когда хотите вернуться.

2
Ankit Manchanda

Пришел сюда из nuxt , проблема была в методе компонента asyncData, я забыл обещание return, которое извлекало данные и устанавливало там заголовок.

1
Nick Synev

В TypeScript моя проблема заключалась в том, что я не закрывал соединение через веб-сокет после получения сообщения.

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

Если вы используете функции обратного вызова, используйте 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)
  })

Протестировано на Node версии v10.16.0 и express 4.16.4

0
Krishnadas PC

Все, что мне нужно было сделать в случае этой ошибки, это 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 
};
0
coder

У меня была эта проблема, когда я вкладывал обещания. Обещание внутри обещания вернуло бы 200 на сервер, но тогда выражение catch внешнего обещания вернуло бы 500. Как только я исправил это, проблема исчезла.

0
Ross Harding

В моем случае это происходит из-за нескольких обратных вызовов. Я вызывал метод next() несколько раз во время кода 

0
Mr. Ratnadeep

Проверьте, не возвращает ли ваш код несколько операторов res.send () для одного запроса. Как, когда у меня была эта проблема ....

Я был этой проблемой в моем приложении узла restify. Ошибка заключалась в том, что 

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

Я занимался различными делами, используя переключатель без записи перерыва. Для тех, кто мало знаком с делом переключения, знайте, что без перерыва возвращайте ключевые слова. Код под регистром и последующими строками будет выполнен независимо от того, что. Так что, хотя я хочу отправить один res.send, из-за этой ошибки он возвращал несколько операторов res.send, что вызвало 

ошибка не может установить заголовки после их отправки клиенту. Что было решено добавлением этого или использованием return перед каждым методом res.send (), таким как return res.send (200)

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

0
KNDheeraj

Весьма вероятно, что это скорее вещь узла, 99% времени это двойной обратный вызов, заставляющий вас ответить дважды или следующий () дважды и т.д., Черт возьми. Это решило мою проблему с использованием next () внутри цикла. Удалите next () из цикла или прекратите вызывать его более одного раза.

0
Naved Ahmad

Если вы не получили помощь сверху: для noobs Причиной этой ошибки является отправка запроса несколько раз, давайте разберемся в некоторых случаях: - 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);* }) })

здесь ответ отправляется дважды, проверьте, отправили ли вы уже ответ

0
Sanjay