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

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

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

Ответ 1

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

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

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

Полный список методов Node.js/Express и когда они должны быть вызваны:

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

  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) (только для экспресс)

Ответ должен быть в голове и становиться Телом:

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

Ответ может быть как в голове, так и в теле и остается в теле:

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

Ответ может быть в голове/теле и заканчивается:

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

Ответ может быть в голове/теле и остается в текущем состоянии:

  1. res.addTrailers(headers)

Ответ должен быть в голове и заканчиваться:

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

Ответ 2

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

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

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

  • в стеке больше элементов и/или
  • что 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 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(), что сбивает сервер подключений.

Ответ 3

У меня возникла та же проблема, и я понял, что это потому, что я вызывал res.redirect без оператора return, поэтому next функция также res.redirect сразу после этого:

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

Ответ 4

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

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

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

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

Ответ 5

Некоторые ответы в этом вопросе ошибочны.Принятый ответ также не очень "практичен", поэтому я хочу опубликовать ответ, который объясняет вещи в более простых выражениях.Мой ответ будет охватывать 99% ошибок, которые я вижу снова и снова.По фактическим причинам ошибки взгляните на принятый ответ.


HTTP использует цикл, для которого требуется один ответ на запрос. Когда клиент отправляет запрос (например, POST или GET), сервер должен отправлять только один ответ.

Это сообщение об ошибке:

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

обычно происходит, когда вы отправляете несколько ответов для одного запроса. Убедитесь, что следующие функции вызываются только один раз за запрос:

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

(и еще несколько, которые редко используются, проверьте принятый ответ)

Обратный вызов маршрута не будет возвращаться при вызове этих функций res. Он будет продолжать работать до тех пор, пока он не достигнет конца функции или оператора return. Если вы хотите вернуться при отправке ответа, вы можете сделать это так: 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, он будет запускать каждую строку в обратном вызове. A Невозможно установить заголовки после отправки сообщения об ошибке, потому что 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);
});

Большой грешник - это асинхронные функции. Возьмите функцию из этого вопроса, например:

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() будет вызван findOneAndUpdate(). Поскольку эта функция асинхронна, res.json(doc1) будет вызываться немедленно. Предположим, ошибок в findOneAndUpdate(). Затем будет res.json(doc2) в else. Теперь отправлено два ответа и появляется сообщение об ошибке "Невозможно установить заголовки".

res.json(doc1), в данном случае, было бы удаление res.json(doc1). Чтобы отправить оба документа обратно клиенту, res.json() в else может быть записан как res.json({ article: doc1, user: doc2 }).

Ответ 6

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

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

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

То, что происходило, - это: проверка соответствия не позволяет вызвать вызов callback и установить ответ. Но не вернулся. Таким образом, он по-прежнему продолжает метод переходит в db и ударяет успех/сбой. Он вызывает тот же самый обратный вызов, в результате чего ответ будет установлен дважды.

Итак, решение простое, вам нужно "вернуть" обратный вызов, чтобы этот метод не выполнялся, как только произошла ошибка, и, следовательно, установите объект ответа один раз

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

Ответ 7

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

Например:

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

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

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

Ответ 8

Иногда вы можете получить эту ошибку при попытке вызвать функцию next() после res.end или res.send, попробуйте удалить, если у вас есть следующий() после 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() сверху, и она будет работать.

Ответ 9

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

Добавьте это 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();
});

Ответ 15

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

Ответ 16

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

Ответ 17

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

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

Ответ 18

Если вы не получите помощь сверху: для 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);* }) })

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

Ответ 19

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

Ответ 20

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

Ответ 21

Проверьте, не возвращает ли ваш код несколько операторов 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; }

Ответ 22

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

Ответ 23

Эта ошибка происходит, когда вы отправляете 2 ответа. Например:

if(condition A)
{ 

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

}

if (condition B){

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

Представьте, что по какой-то причине условия A и B выполняются, поэтому во втором render вы получите эту ошибку

Ответ 25

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