2017-10-10 12 views
2

express.jsのドキュメントはnext()がルートで呼び出されることはありませんならば、express.jsのnext()を省略するとどうなりますか?

要求が

https://expressjs.com/en/guide/writing-middleware.html)は

それが何を意味するものではないぶら下がっ残されるだろうと述べていますか?すでにres.sendと呼ばれていて、リクエスト処理が完了していても、すべてのリクエストをnext()と確定する必要がありますか?もし私がそれを省略してもメモリリークや他の問題はありませんか?

更新: 私は本当にミドルウェアをルートと混同しています。私はサイクルが終わることを忘れていました。しかし、私はどのようにそれを終了するか分からなかった。

+0

**ミドルウェア**については、ルーティングについて質問しています。ドキュメントの正しい部分を読んでいると思いますか?あなたはミドルウェアが何であるか知っていますか? – Mjh

+0

問題をより詳しく説明するコードを投稿する –

答えて

2

これは何を意味しますか?

リクエスト/応答のサイクルがまだ終了していないことを意味します。応答はブラウザに送信されず、ブラウザは待機し続けます。

すでにres.sendを呼び出していて、要求処理が完了していても、すべての要求をnext()でファイナライズする必要があることを意味しますか?現在のミドルウェア機能は、要求応答サイクルを終了しない場合

全文がある...

、 それは次呼び出す必要があります()の次のミドルウェア機能に制御を渡します。 それ以外の場合、リクエストはハングアップのままになります。

したがって、現在のミドルウェア内でサイクルを終了する場合は、next()を使用せずにres.send、res.endまたはres.jsonを呼び出すことができます。しかし、次のミドルウェアに行くつもりなら、next()を呼び出す必要があります。それ以外の場合、次のミドルウェアには行きません。

私はそれを省略してもメモリリークやその他の問題はありませんか?

要求/応答サイクルが終了していない場合、そのサイクルに対応するために割り当てられたメモリは返されません。これはメモリリークを意味します。

1

メモリリークが発生するとは思わないが、私たちはnext()を呼び出してmiddlewareを呼び出すことができます。まず、ユーザーを認証し、次にそのリクエストのデータを送信する2つのことがあるとします。 1つのミドルウェアで最初に認証し、次にユーザーがその要求を正常に認証したときに次に呼び出す。

1

nextまたはcallback機能は、本質的に、現在の機能が処理されたイベントループエミッタに信号を送る方法です。あなたはそれをparamとして渡すことによって、次の関数にデータを渡すことができます。

callbackまたはnext関数を呼び出さないと、イベントループの次の関数は決して実行されません。 Expressは要求を処理した後に特定の機能チェーンを持つ必要があります。ですから、コールバック関数自体をスキップするのは良い方法ではありません。あなたがチェーン内の次のミドルウェアに制御を渡したいとき

1

next()は、ミドルウェアの順序宣言が関連していることから、急行はちょうどの世話をする

(エラーを処理するなど、一般的なミドルウェア)と呼ばれています関数の引数を確認し、3番目のパラメータが見つかった場合は、ポインタを後続のミドルウェアに渡します。

結果がクライアントに返された場合(例えば、res.send()を呼び出す場合)、リクエストが既に終了しているので、next()を呼び出す必要はありません。

//this is an example of a hanging request since you're not calling 
//niether next nor res.send() 
router.get('/myRoute', (req, res, next) => { 
    //do nothing 
}) 
1

ませんメモリリーク、および(res.send()後)に実行するこれ以上のミドルウェアが存在しない場合はnext()をコールする必要はありません。 next()は、cb関数のプレースホルダです。ミドルウェアとは、要求/応答サイクルの終わりに達するまで、順次呼び出される1つ以上の関数です。この例では、loginエンドポイントに到達すると、2つのミドルウェア、validatechangeStuffが実行されます。 returnResponse関数を呼び出し、要求 - 応答サイクルを終了します。

get('/login', 
validate, 
changeStuff, 
returnResponse 
); 

function validate(req, res, next) { 
//validate logic does something then calls next() 

next() 
//just like calling changeStuff(req, res, next) 
} 

function changeStuff(req, res, next) { 
//changeStuff logic changes something then calls next() 

next() 
//just like calling returnResponse(req, res, next) 
} 

function returnResponse(req, res) { 
//will return something and that is the end of the req-res cycle 
//there are no more functions to call, if you try to call next() 
//you would get an error, because at this point next() would be 
//undefined 

res.send(req.body) 
} 
関連する問題