web-dev-qa-db-ja.com

エラー:ヘッダがクライアントに送信された後でヘッダを設定できません

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

私のコードの何が問題になっているのでしょうか。

545
DjangoRocks

Expressのresオブジェクトは Node.jsのhttp.ServerResponse のサブクラスです( http.jsのソースを読む )。 res.setHeader(name, value)を呼び出すまでは、res.writeHead(statusCode)を何度でも呼び出すことができます。 writeHeadの後、ヘッダは焼き付けられ、あなたはres.write(data)、そして最後にres.end(data)しか呼び出せません。

エラー「エラー:送信後にヘッダーを設定できません」つまり、すでにBodyまたはFinishedの状態になっていますが、何らかの関数がheaderまたはstatusCodeを設定しようとしました。このエラーが表示されたら、本文の一部が既に書き込まれた後にヘッダーを送信しようとするものを探してみてください。たとえば、誤って2回呼び出されたコールバック、または本体が送信された後に発生したエラーを探します。

あなたのケースでは、あなたはres.redirect()を呼び出しました。そして、それは応答がFinishedになる原因となりました。それからあなたのコードはエラーを投げました(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]) (Expressのみ)
  7. res.charset = 'utf-8'(Expressのみ。Express固有のメソッドにのみ影響します)
  8. res.contentType(type) (Expressのみ)

応答は 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]]) (Expressのみ)
  4. res.attachment(filename) (Expressのみ)
  5. res.sendfile(path[, options[, callback]]) (Expressのみ)
  6. res.json(obj[, headers|status[, status]]) (Expressのみ)
  7. res.redirect(url[, status]) (Expressのみ)
  8. res.cookie(name, val[, options]) (Expressのみ)
  9. res.clearCookie(name[, options]) (Expressのみ)
  10. res.render(view[, options[, fn]]) (Expressのみ)
  11. res.partial(view[, options]) (Expressのみ)
874
yonran

私はしばらくこのエラーにも遭遇しました。私は頭の周りを包んだ(願っている)と思うので、参考のためにここに書きたかった。

app.useメソッドを使ってミドルウェアを connect または express (connectに基づいて構築されている)に追加すると、connectのServer.prototype.stackに項目が追加されます(少なくとも現在のnpm install connectとは異なります)。この記事の時点での1つのgithub)サーバーがリクエストを受け取ると、(request, response, next)メソッドを呼び出してスタックを反復処理します。

問題は、ミドルウェア項目の1つにレスポンスボディまたはヘッダを書き込む場合(何らかの理由で/またはそのどちらかのように見える)、ただし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 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のサーバを混乱させます。

83
Lance Pollard

私はこれと同じ問題を抱えていて、returnステートメントなしでres.redirectを呼び出していたので、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();
};
40
ergusto

多くの人がこのエラーにぶつかります。これは非同期処理と混同しやすいです。たぶんあなたのコードのいくつかは最初のティックでヘッダを設定していて、それからあなたは将来のティックで非同期コールバックを実行しています。その間に、応答ヘッダーが送信されますが、その後さらにヘッダー(30Xリダイレクトなど)が追加のヘッダーを追加しようとしますが、応答ヘッダーが既に送信されているので遅すぎます。

何が原因でエラーが発生しているのか正確にはわかりませんが、調査の可能性がある領域としてコールバックを調べてください。

コードを単純化するための簡単なヒント。 app.configure()を取り除き、トップレベルのスコープで直接app.useを呼び出すだけです。

everyauth モジュールも参照してください。これは、Facebookや、他にもたくさんのサードパーティの認証プロバイダが行っています。

34
Peter Lyons

このQ&Aの答えのいくつかは間違っています。受け入れられた答えもまたあまり「実用的」ではないので、私はもっと簡単な言葉で物事を説明する答えを投稿したいと思います。私の答えは、私が何度も何度も投稿しているのを見るエラーの99%をカバーするでしょう。エラーの背後にある実際の理由で、受け入れられた答えを見てください。


HTTPは、リクエストごとに1つのレスポンスを必要とするサイクルを使用します。クライアントがリクエストを送信するとき(例えばPOSTまたはGET)、サーバーはそれに対して1つの応答のみを返すべきです。

このエラーメッセージ:

エラー:送信後にヘッダを設定できません。

通常、1つの要求に対して複数の応答を送信したときに発生します。次の関数が要求ごとに一度だけ呼び出されるようにしてください。

  • 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に送信されると、コールバックのすべての行で実行されます。 res.json()が2回呼び出されるため、送信後にヘッダーを設定できませんエラーメッセージがスローされます。つまり、2つの応答が送信されます。

リクエストごとに送信できるレスポンスは1つだけです。


上記のコードサンプルのエラーは明らかでした。もっと典型的な問題はいくつかの枝があるときです。

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応答を送信します。その後は、応答も送信する次のステートメントに進みます。これで2つの応答が送信され、エラーメッセージが表示されます。 1つの応答だけを送信するようにして、このコードを修正できます。

.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())があります。エラーがなければ(errfindOneAndUpdate()が呼ばれます。この関数は非同期なので、res.json(doc1)がすぐに呼び出されます。 findOneAndUpdate()にエラーがないと仮定します。 elseres.json(doc2)が呼び出されます。 2つの応答が送信され、ヘッダーを設定できませんエラーメッセージが表示されます。

この場合の修正は、res.json(doc1)を削除することです。両方のドキュメントをクライアントに送り返すために、elseのres.json()res.json({ article: doc1, user: doc2 })と書くことができます。

28
MikaS

私はこの問題について私の頭をゆだねました、そしてそれはコールバックを扱う上での不注意な間違いのために起こりました。コールバックが返されないと、応答は2回設定されます。

私のプログラムはリクエストを検証しDBを問い合わせるコードを持っていました。エラーがあるかどうかを検証した後、検証エラーとともにindex.jsをコールバックしていました。そして検証がパスした場合、それは先に進み、成功/失敗でデータベースをヒットします。

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

何が起こっていたのでしょうか:Incaseの検証がコールバックの呼び出しに失敗し、応答が設定されるのです。しかし戻ってこない。そのため、メソッドはdbに進み、成功/失敗を続けます。これは同じコールバックを再度呼び出し、その結果応答が今度は2回設定されます。

そのため、解決策は簡単です。エラーが発生したらメソッドが実行を継続しないようにコールバックを「返す」必要があるため、応答オブジェクトを1回設定します。

  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

res.end または res.send の後にnext()関数を呼び出そうとすると、このエラーが発生することがあります。res.sendまたはres.endの後にnext()がある場合は、削除してみてください。あなたの機能注意:ここで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

私の場合は、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コンポーネントのcomponentWillUnmountコールバックのチャンネルから購読を解除しなかったときにReactとpostal.jsで起こりました。

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
Adam Boostani

これに来て、他の解決策のどれも助けなかった人にとって、私の場合、これは画像のアップロードを処理したが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接続を閉じないようにしました。

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

コールバック関数を使用している場合は、returnブロックの後にerrを使用します。これは、このエラーが発生する可能性があるシナリオの1つです。

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および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

私は約束を入れ子にしていたときに私はこの問題を抱えていた。 promiseの内側のpromiseはサーバーに200を返しますが、外側のpromiseの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(200)のように各res.send()メソッドの前にreturnを使用することで解決しました。

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

0
KNDheeraj

これはもっとノード的なものである可能性が非常に高いです。99%の場合、2回のコールバック、またはnext()の2回の応答などが発生します。私の問題はループ内で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()を2回呼び出すとエラーになります

  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回送信ですすでに返事を送ったかどうかを確認します

0
Sanjay