Node.js:req.query []とreq.paramsの違い


124

経由QUERY_STRINGの引数を取得する間に違いがあるreq.query[myParam]とはreq.params.myParam?もしそうなら、いつ私はどれを使うべきですか?

回答:


142

req.params(URLのパス部分に)ルートパラメータreq.queryが含まれ、(URLの後に)URLクエリパラメータが含まれ?ます。

を使用req.param(name)して両方の場所(およびreq.body)でパラメータを検索することもできますが、このメソッドは廃止されました。


ああ、わかりました。おかげで、どちらもExpressによって提供されます。そして、req.body.myParamを介してアクセスするPOSTデータ?

1
正しい。どちらを使用するかは、何をしようとしているのかによって異なります。
JohnnyHK

また、「req.body、req.params、およびreq.queryへの直接アクセスは、明確にするために優先する必要があります-各オブジェクトからの入力を本当に受け入れない限り」。-
Ryan Q

2
req.paramは非推奨になりました。ノードはreq.queryorの使用を提案していますreq.params
SaiyanGirl

3
なぜそれを廃止するのですか?paramsまたはqueryを使用し、それを別のものに変更する場合はどうなりますか?
John

247

このルートを考えると

app.get('/hi/:param1', function(req,res){} );

このURLを与えられた http://www.google.com/hi/there?qs1=you&qs2=tube

次のものがあります。

必須 クエリ

{
  qs1: 'you',
  qs2: 'tube'
}

必須 パラメータ

{
  param1: 'there'
}

Express req.params >>


/ hi /を取得する必要がある場合はどうなりますか?
ダニエル2015

2
req.url、req.originalUrl、またはreq._originalUrlを確認してから、/
ruffrey

22

次のようにルート名を定義したとします。

https://localhost:3000/user/:userid

これは次のようになります。

https://localhost:3000/user/5896544

ここで、印刷する場合: request.params

{
userId : 5896544
}

そう

request.params.userId = 5896544

したがって、request.paramsは、名前付きルートへのプロパティを含むオブジェクトです

そしてrequest.queryは、 URLなどでクエリパラメータから来ています:

https://localhost:3000/user?userId=5896544 

request.query

{

userId: 5896544

}

そう

request.query.userId = 5896544

良い説明
ABK

7

これで、ドット表記を使用してクエリにアクセスできるはずです。

アクセスしたい場合は、GETリクエストを受け取っ/checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXており、使用したクエリをフェッチしたいとします。

var type = req.query.type,
    email = req.query.email,
    utm = {
     source: req.query.utm_source,
     campaign: req.query.utm_campaign
    };

パラメータは、(例)のような、リクエストを受信するための自己定義パラメータに使用されます。

router.get('/:userID/food/edit/:foodID', function(req, res){
 //sample GET request at '/xavg234/food/edit/jb3552'

 var userToFind = req.params.userID;//gets xavg234
 var foodToSearch = req.params.foodID;//gets jb3552
 User.findOne({'userid':userToFind}) //dummy code
     .then(function(user){...})
     .catch(function(err){console.log(err)});
});

0

についての重要な注意点を1つ挙げておきreq.queryます。現在、私はページ付け機能に基づいて取り組んでいるため、req.query興味深い例を1つ紹介します...

例:

// Fetching patients from the database
exports.getPatients = (req, res, next) => {

const pageSize = +req.query.pageSize;
const currentPage = +req.query.currentPage;

const patientQuery = Patient.find();
let fetchedPatients;

// If pageSize and currentPage are not undefined (if they are both set and contain valid values)
if(pageSize && currentPage) {
    /**
     * Construct two different queries 
     * - Fetch all patients 
     * - Adjusted one to only fetch a selected slice of patients for a given page
     */
    patientQuery
        /**
         * This means I will not retrieve all patients I find, but I will skip the first "n" patients
         * For example, if I am on page 2, then I want to skip all patients that were displayed on page 1,
         * 
         * Another example: if I am displaying 7 patients per page , I want to skip 7 items because I am on page 2,
         * so I want to skip (7 * (2 - 1)) => 7 items
         */
        .skip(pageSize * (currentPage - 1))

        /**
         * Narrow dont the amound documents I retreive for the current page
         * Limits the amount of returned documents
         * 
         * For example: If I got 7 items per page, then I want to limit the query to only
         * return 7 items. 
         */
        .limit(pageSize);
}
patientQuery.then(documents => {
    res.status(200).json({
        message: 'Patients fetched successfully',
        patients: documents
    });
  });
};

あなたは気づいてます+の前に看板をreq.query.pageSizeし、req.query.currentPage

どうして?この場合に削除する+と、エラーが発生し、無効なタイプを使用するため、そのエラーがスローされます(エラーメッセージの「制限」フィールドは数値でなければなりません)。

重要:デフォルトでは、これらのクエリパラメータから何かを抽出した場合、URLになり、テキストとして扱われるため、常に文字列なります。

数値を操作し、クエリステートメントをテキストから数値に変換する必要がある場合は、ステートメントの前にプラス記号を追加するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.