620

次のようなクエリのパラメーターを取得する方法を知っています。

app.get('/sample/:id', routes.sample);

この場合、 を使用req.params.idしてパラメーターを取得できます (例: 2in /sample/2)。

ただし、のようなURL/sample/2?color=redの場合、変数にアクセスするにはどうすればよいですcolorか?

試してみreq.params.colorましたが、うまくいきませんでした。

4

10 に答える 10

91

ルートのクエリ文字列パラメーターの値を取得するには、req.query を使用します。req.queryを参照してください。たとえば、ルートhttp://localhost:3000/?name=satyamで名前パラメーターの値を取得したい場合、「Get」ルート ハンドラーは次のようになります。

app.get('/', function(req, res){
    console.log(req.query.name);
    res.send('Response send to client::'+req.query.name);

});
于 2016-08-28T17:00:55.463 に答える
73

更新: req.param()は非推奨になったため、今後はこの回答を使用しないでください。


あなたの答えはそれを行うための好ましい方法ですが、req.param(parameterName, defaultValue).

あなたの場合:

var color = req.param('color');

エクスプレスガイドより:

検索は次の順序で実行されます。

  • req.params
  • 必須ボディ
  • 必須クエリ

ガイドには次のように記載されていることに注意してください。

各オブジェクトからの入力を真に受け入れる場合を除き、明確にするために req.body、req.params、および req.query への直接アクセスを優先する必要があります。

しかし、実際には、req.param()十分に明確で、特定のタイプのリファクタリングが容易になることがわかりました。

于 2014-09-22T15:27:18.243 に答える
48

@Zugwaitの答えは正しいです。req.param()廃止されました。req.paramsreq.queryまたはを使用する必要がありますreq.body

しかし、それを明確にするために:

req.paramsルート値のみが入力されます。つまり、 のようなルートがある場合、またはのいずれかに/users/:idアクセスできます。idreq.params.idreq.params['id']

req.queryルート内にあるかどうかに関係なく、すべてのreq.bodyパラメーターが入力されます。もちろん、クエリ文字列のパラメーターは で使用でき、投稿本文のパラメーターは で使用できます。req.queryreq.body

したがって、ルートにないので、質問に答えると、またはcolorを使用して取得できるはずです。req.query.colorreq.query['color']

于 2015-08-02T16:56:21.180 に答える
18

Express マニュアルには、req.queryを使用して QueryString にアクセスする必要があると記載されています。

// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {

  var isSmall = req.query.size === 'small'; // > true
  // ...

});
于 2016-02-29T14:53:05.567 に答える
3

Express のいくつかのアプリで使い始めた便利なテクニックは、Express のリクエスト オブジェクトのクエリ、パラメーター、ボディ フィールドをマージするオブジェクトを作成することです。

//./express-data.js
const _ = require("lodash");

class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);
     }

}

module.exports = ExpressData;

次に、コントローラー本体、またはエクスプレスリクエストチェーンの範囲内の他の場所で、次のようなものを使用できます。

//./some-controller.js

const ExpressData = require("./express-data.js");
const router = require("express").Router();


router.get("/:some_id", (req, res) => {

    let props = new ExpressData(req).props;

    //Given the request "/592363122?foo=bar&hello=world"
    //the below would log out 
    // {
    //   some_id: 592363122,
    //   foo: 'bar',
    //   hello: 'world'
    // }
    console.log(props);

    return res.json(props);
});

これにより、ユーザーがリクエストで送信した可能性のあるすべての「カスタム データ」を「掘り下げる」ことができて便利です。

ノート

なぜ「props」フィールドなのですか? これは省略されたスニペットだったので、私はこの手法を多くの API で使用しています。また、認証/承認データをこのオブジェクトに保存します (以下の例を参照)。

/*
 * @param {Object} req - Request response object
*/
class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);

        //Store reference to the user
        this.user = req.user || null;

        //API connected devices (Mobile app..) will send x-client header with requests, web context is implied.
        //This is used to determine how the user is connecting to the API 
        this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
    }
} 
于 2017-10-09T08:51:29.787 に答える