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

通过 req.query[myParam]req.params.myParam获取 QUERY _ STRING 参数之间有区别吗? 如果有,什么时候应该使用哪个参数?

301088 次浏览

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

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

根据这条路线

app.get('/hi/:param1', function(req,res){} );
// regex version
app.get(/^\/hi\/(.*)$/, function(req,res){} );
// unnamed wild card
app.get('/hi/*', function(req,res){} );

并给出了这个 URL http://www.google.com/hi/there?qs1=you&qs2=tube

你会得到:

标准 疑问

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

标准 Params

{
param1: 'there'
}

当使用正则表达式定义路由时,将使用 req.params[n]在数组中提供捕获组,其中 n 是第 n 个捕获组。此规则适用于具有字符串路由的未命名通配符匹配

表达 req.params > >

您现在应该能够使用点符号访问查询了。

如果您想访问,就说您在 /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)});
});

我想提到一个关于 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,并被视为文本。

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

请求 Params

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

https://localhost:3000/user/:userId

将会变成:

https://localhost:3000/user/5896544

在这里,如果你要打印: 请求 Params

{
userId : 5896544
}

所以

request.params.userId = 5896544

因此 请求 Params是一个包含指定路由的属性的对象


Query

Query来自 URL 中的查询参数 例如:

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


Query

{


userId: 5896544


}

所以

request.query.userId = 5896544


我只想补充一点,如果你来自 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)。