Node.js:req.query []和req.params之间的区别


124

通过req.query[myParam]和获得QUERY_STRING参数之间有区别req.params.myParam吗?如果是这样,我什么时候应该使用哪个?

Answers:


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.queryreq.params
SaiyanGirl

3
为什么不赞成?如果我们使用参数或查询然后决定将其更改为另一个怎么办?
2015年

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 /怎么办?
丹尼尔(Daniel)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
    };

PARAMS被用于自定义的参数,用于接收请求,像(例如):

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

我想提一个有关的重要说明req.query,因为目前我正在基于进行分页功能,req.query并且有一个有趣的示例向您展示...

例:

// 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.pageSizereq.query.currentPage

为什么?如果+在这种情况下删除,则会收到错误消息,并且会抛出该错误消息,因为我们将使用无效的类型(错误消息“限制”字段必须为数字)。

重要提示:默认情况下,如果您从这些查询参数中提取内容,则该内容将始终为字符串,因为它来自URL,并且被视为文本。

如果需要处理数字,并将查询语句从文本转换为数字,则只需在语句前面添加加号即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.