1

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,
   ...)

これは問題ないように見えますが、これも少し冗長で、少し機械的なように見えます。

何かが欠けているように感じます。これを行うためのよりエレガントな方法があります。パラメータを取得する方法を示すある種の関数を使用してミドルウェアをパラメータ化することを考えましたが、これは実際には簡単ではありません (定義の時点でリクエストがスコープ内にないため)。

誰かがこの問題の良い解決策を得ましたか?

4

3 に答える 3

4

これを処理する別の方法があります。

var loadMW = function (request, response, next) {
    var thingID = request.param('id');

    // load thing from db and put in locals
    response.locals.thing = loadThing(id); //sync for simplicity
    next();
}

のドキュメントにrequest.param()は、次の順序でパラメーターを検索すると書かれています。

  1. req.paramsexpress.bodyParse()
  2. req.body
  3. req.query

セクションは、ある時点で使用しreq.bodyたことに依存すると思います。express.bodyParser()

于 2013-12-21T05:03:35.020 に答える
0

次のようなものはうまくいきませんか?

var loadMW = function (request, response, next) {
    var thingID;
    if(request.param.id) {
        thingID = request.param.id;
    }
    else {
        thingID = request.body.id;
    }
    // load thing from db and put in locals
    response.locals.thing = loadThing(thingID); //sync for simplicity
    next();
}

'/user/:id?'次のルートでは、パラメータがオプションであるため、冗長性を減らすために、エクスプレスでオプションのパラメータを確認することもできidます。

ミドルウェアについては、http://expressjs.com/api.html#app.useを参照してください。

于 2012-11-13T15:20:00.180 に答える
0

それが私のプロジェクトである場合、これは私がそれをどのように行うかの確率です:

ルート ハンドラーは、パラメーターがクライアントからどのように取得されるかについての知識をカプセル化し、loadMWそれを取得する (そして提供する – この例では) 方法を知っているだけです。

app.get('/getThing/:id', function(req, res) { loadMW(req.params, res); });
app.post('/getThing', function(req, res) { loadMW(req.body, res); });

function loadMW(opts, response) {
  var thingId = opts.id;
  ...
}

プロジェクトが成長するにつれて、loadMW関数callbackresponse.

于 2012-11-13T16:17:01.147 に答える