2016-10-18 4 views
0

を持つExpressアプリケーションで「エラー:送信後にヘッダーを設定できません」Expressおよびノー​​ドが新しく、アプリケーションで保護RESTエンドポイントをテストするときに、データがエンドポイントから返されますただし、コンソールログにはコンソールログが表示されます。Node:

"Error: Can't set headers after they are sent" 

サーバーを停止します。ここでのSOの検索は、これは、複数の応答を送信するときに発生するようですが、私は私のコードでそれを見ていない:

router.get('/books', userAuthenticated, function (req, res, next) { 
    Book.find({}, function(err, docs){ 
     if(err) { 
      res.send(err) 
     } else { 
      res.send(docs); 
      // next(); 
      // return; 
     } 
    }) 
}); 

午前クライアントへ/からのリクエスト/レスポンスを送信する場合、または予想されるこのエラーですサーバー上のエラーを処理する際に何か不足していますか?

+0

userAuthenticatedミドルウェアが応答を送信するのに最適です。その関数をチェックして、next()を呼び出す前にresが送信されていないことを確認してください。 – Brian

+0

私は単純に同じエラーを返すようにリファクタリングしたuserAuthenticatedミドルウェアです。 isAuthenticated()){ return next(); } res.redirect( '/ notloggedin'); } – user2232681

+0

あなたのブラウザまたは郵便配達員で応答を確認してください。デベロッパーコンソールを開き、ネットワーキングに行き、/ books – Brian

答えて

0

Expressは「ミドルウェア」という概念を備えたnode.jsサーバーで、複数の層のレイヤーが要求に対して操作する機会を得ます。

この場合、関数が応答を2回返さないことを確認するだけでなく、他のミドルウェアも応答を返さないことを確認する必要があります。

このコードは、この関数の前に "userAuthenticated"というミドルウェアが呼び出されていることを示しています。そのミドルウェアがすでに応答を送信しているかどうかを確認する必要があります。

+0

私は単純に同じエラーでリファクタリングしたuserAuthenticatedミドルウェアです:function userAuthenticated(req、res、next){if(req.isAuthenticated()){return next(); } res.redirect( '/ notloggedin'); } – user2232681

0
I don't think the problem was in the middleware. It looks like I was calling done() twice in passport deserialize. I commented out the first instance and the problem disappeared in all my routes. Although, I am not sure if I should comment out the first or second instance but I'll work on that next. 
passport.deserializeUser(function(obj, done) { 
    console.log(obj); 
    Account.findById(obj, function(err, user) { 
     console.log(user); 
     //done(err, user); 
    }); 
return done(null, obj); 
});