Express コードを構造化する方法を理解しようとしていますが、パラメーターの処理方法について混乱しています。例として、データベースから何かをロードするミドルウェアを作成したとします。
var loadMW = function (request, response, next) {
var thingID = request.params.id;
// load thing from db and put in locals
response.locals.thing = loadThing(id); //sync for simplicity
next();
}
これは、次のようなルートで使用すると問題ありません。
app.get('/getThing/:id', loadMW, ...)
ただし、リクエスト本文でモノの ID を受け入れるルートも必要だとします (この場合、これは不自然に見えますが、実際に発生します)。
app.post('/getThing', loadMW, ...)
loadMW は request.params を参照することを期待しているため、これは機能しません。この場合、コードを構成する最良の方法は何ですか? いくつかの代替案を考えることができます。まず、新しいミドルウェアを定義します。
var loadMWBody = function (request, response, next) {
var id = request.body.id;
...
}
これは不必要に冗長で、少し醜いようです。
もう 1 つの方法は、loadMW を変更して、ID を常にローカルに確認し、ルート内のパラメーターを明示的に移動することです。
var loadMW = function (request, response, next) {
var thingID = response.locals.id;
// load thing from db and put in locals
response.locals.thing = loadThing(id); //sync for simplicity
next();
}
app.get('/getThing/:id', function (request, response, next) {
response.locals.id = request.params.id;
next();
},
loadMW,
...)
app.post('/getThing', function (request, response, next) {
response.locals.id = request.body.id;
next();
},
loadMW,
...)
これは問題ないように見えますが、これも少し冗長で、少し機械的なように見えます。
何かが欠けているように感じます。これを行うためのよりエレガントな方法があります。パラメータを取得する方法を示すある種の関数を使用してミドルウェアをパラメータ化することを考えましたが、これは実際には簡単ではありません (定義の時点でリクエストがスコープ内にないため)。
誰かがこの問題の良い解決策を得ましたか?