次のようなクエリのパラメーターを取得する方法を知っています。
app.get('/sample/:id', routes.sample);
この場合、 を使用req.params.id
してパラメーターを取得できます (例: 2
in /sample/2
)。
ただし、のようなURL/sample/2?color=red
の場合、変数にアクセスするにはどうすればよいですcolor
か?
試してみreq.params.color
ましたが、うまくいきませんでした。
次のようなクエリのパラメーターを取得する方法を知っています。
app.get('/sample/:id', routes.sample);
この場合、 を使用req.params.id
してパラメーターを取得できます (例: 2
in /sample/2
)。
ただし、のようなURL/sample/2?color=red
の場合、変数にアクセスするにはどうすればよいですcolor
か?
試してみreq.params.color
ましたが、うまくいきませんでした。
ルートのクエリ文字列パラメーターの値を取得するには、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);
});
更新: req.param()
は非推奨になったため、今後はこの回答を使用しないでください。
あなたの答えはそれを行うための好ましい方法ですが、req.param(parameterName, defaultValue)
.
あなたの場合:
var color = req.param('color');
エクスプレスガイドより:
検索は次の順序で実行されます。
- req.params
- 必須ボディ
- 必須クエリ
ガイドには次のように記載されていることに注意してください。
各オブジェクトからの入力を真に受け入れる場合を除き、明確にするために req.body、req.params、および req.query への直接アクセスを優先する必要があります。
しかし、実際には、req.param()
十分に明確で、特定のタイプのリファクタリングが容易になることがわかりました。
@Zugwaitの答えは正しいです。req.param()
廃止されました。req.params
、req.query
またはを使用する必要がありますreq.body
。
しかし、それを明確にするために:
req.params
ルート値のみが入力されます。つまり、 のようなルートがある場合、またはのいずれかに/users/:id
アクセスできます。id
req.params.id
req.params['id']
req.query
ルート内にあるかどうかに関係なく、すべてのreq.body
パラメーターが入力されます。もちろん、クエリ文字列のパラメーターは で使用でき、投稿本文のパラメーターは で使用できます。req.query
req.body
したがって、ルートにないので、質問に答えると、またはcolor
を使用して取得できるはずです。req.query.color
req.query['color']
Express マニュアルには、req.queryを使用して QueryString にアクセスする必要があると記載されています。
// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {
var isSmall = req.query.size === 'small'; // > true
// ...
});
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";
}
}