169

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

4

6 回答 6

329

Given this route

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

and given this URL http://www.google.com/hi/there?qs1=you&qs2=tube

You will have:

req.query

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

req.params

{
  param1: 'there'
}

Express req.params >>

于 2013-01-24T18:27:20.560 回答
187

req.params包含路由参数(在 URL 的路径部分中),并req.query包含 URL 查询参数(在?URL 的后面)。

您还可以使用req.param(name)在两个位置(以及req.body)查找参数,但此方法现在已弃用。

于 2013-01-19T19:37:21.820 回答
51

假设您已经像这样定义了您的路线名称:

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 

请求查询

{

userId: 5896544

}

所以

request.query.userId = 5896544

于 2019-05-17T10:06:12.353 回答
8

您现在应该能够使用点表示法访问查询。

如果你想访问说你正在接收一个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)});
});
于 2017-08-24T14:48:52.527 回答
1

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

为什么?如果你+在这种情况下删除,你会得到一个错误,并且会抛出这个错误,因为我们将使用无效的类型(错误消息'limit'字段必须是数字)。

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

如果我们需要处理数字,并将查询语句从文本转换为数字,我们可以简单地在语句前面添加一个加号。

于 2019-04-08T19:42:20.503 回答
0

我只想补充一点,如果您来自axios, (GET/POST),您可以通过配置使用query/url params(可读):req.query

axios.post('/users', {...data}, {
  headers: {...anyHeaders},
  params: {uid: `${uid}`}
})

并且您通过以下路径使path/route variables(可读)可用:req.params

axios.get(`/users/${uid`}, {
  headers: {...anyHeaders}
})

我还要补充一点,用于在服务器上读取查询参数的名称必须与来自客户端的名称匹配。对于可以在服务器上使用任何名称的路径变量,情况并非如此,前提是该部分路径/路由可用(基本上是进行替换 - 有点像react-router它是如何做到的:) /path/:variable

于 2021-07-18T09:21:36.597 回答