2016-10-25 27 views
0

(。それらが送られた後、tはヘッダーを設定\「できます」 ')新しいエラーをスロー:アプリをNode.jsの:私は次のコードを持っている

router.get('/:widget', function(req, res, next) { 
     var widget = req.params.widget; 
     if (! validate(widget)) { 
       res.status(400).send("Invalid widget"); 
       return; 
     } 

     redis.hget("e:" + widget, 'ccid', function (e, d) { 
       if (e){ 
         res.status(500).send("Database query failed"); 
         return; 
       } 
       if (d) { 
         res.status(200).send("Resource found"); 
         return; 
       } else { 
         res.status(400).send("Unknown widget"); 
         return; 
       } 
     }); 

     res.status(200).send("why are you here?"); 
     return; 
}); 

を私はコードが当たるという印象の下にありました"return" ...関数を終了します。

res.status(400).send("Unknown widget"); 
    return; 

パス、それはまだだけでなく

 res.status(200).send("why are you here?"); 
     return; 

を打つ: は、しかし、何が起こっているようだと、ロジックが当たったときということです。私はそれが方法を終了したと思った。 明らかに、私は間違っています...上記のエラーメッセージが表示されています。 redis.hgetの呼び出しのあとにres.send()とreturn()を削除するとエラーが消えます。

各res.status()。send()の後に "return"ステートメントの代わりに何を使用するべきですか?

+0

「return」を押すと機能が終了します。しかし、あなたのケースでは、あなたは '.get( '/:widget' ...)'の内部にある '.hget'に渡す_callback_を終了します。 – vlaz

答えて

1

"redis.hget"は非同期呼び出しです。 "redis.hget"は非同期呼び出しであるため、 "router.get"関数は "res.status(200).send("なぜあなたはここにいるのですか? ")というメッセージが出て最後まで実行し続けます。クライアントへの応答

次のイベントループで、非同期関数 "redis.hget"が実行され、Redisサーバーからの応答を取得した後、再び "res.status(400).send ..."を呼び出します。しかし、応答がすでにクライアントに送信されているので、「送信後にヘッダーを設定できません」というエラーメッセージが表示されます。

1

function (e, d) { ... }は、とは異なり、と呼ばれる非同期関数です。

function(req, res, next) { ... }から戻っても、その機能は実行されません(またはその逆)。

あなたは常にが同様function(req, res, next) { ... }から1を送信しようとするために、それは意味がありませんfunction (e, d) { ... }内部からの応答を送信することを考えます。

1

返信文は、コールバック関数(redis.hget()に渡す)にあります。あなたの返信文はそれを取り除きますが、次にrouter.get()関数の最後に進みます。

関連する問題