Hapijs 查询参数未定义
Hapijs query parameters undefined
我目前正在使用 hapi,我遇到了一个问题,我似乎找不到任何解决方案或以前提到过。当我发送以下请求时,只有我的第一个查询参数在 request.query 对象中。
curl -H "Content-Type: application/json" -X PUT https://localhost:3000/lists/{username}/{listname}?token='token'&resource_id='resource_id'
将 {}
和 ''
中的项目替换为实际名称。
我的路线目前是这样写的
server.route({
method: 'PUT',
path: '/lists/{username}/{listname}',
handler: function(request, reply) {
const username = encodeURIComponent(request.params.username);
const listname = encodeURIComponent(request.params.listname);
const resource_id = request.query.resource_id;
const token = request.query.token;
console.log(request.query);
verify(token, username, {callback}, listname, resource_id, reply);
}
});
console.log
调用的结果是
{ token: 'token' }
如果我执行 console.log(resource_id)
,我会在控制台中得到 "undefined"。 hapi 的文档指出所有查询参数都应在 request.query
对象中找到。由于某种原因,这没有发生。我查看了 hapijs 文档,查看了我的 API 调用,还阅读了人们处理查询参数的示例。知道这里发生了什么吗?
问题出在你的 curl 命令上,而不是 HapiJS。
尝试运行
curl -H "Content-Type: application/json" -X PUT "https://localhost:3000/lists/{username}/{listname}?token=token&resource_id=resource_id"
它是查询字符串中被解释为命令结束的符号。有关命令为何不起作用的解释,请参阅 this questions answer
问题在于触发 curl 请求。 curl请求中有&
,URL不在引号内;所以 &
变成 shell 修改后启动一个分离进程。您的路线运行良好,只需在引号
中使用 URL 触发 curl
curl -H "Content-Type: application/json" -X PUT "https://localhost:3000/lists/{username}/{listname}?token='token'&resource_id='resource_id'"
如果你想从查询参数中获取数据,那么你应该像下面的代码那样做:
server.route({
method: 'PUT',
path: '/lists/{username}/{listname}',
validate: {
params: {
username: Joi.string().min(1).max(15).required(),
listname:Joi.string().min(1).max(15).required(),
},
query: {
token: Joi.number().integer().min(1).max(100).required(),
resource_id: Joi.number().integer().min(1).max(100).required(),
}
},
handler: function (request, reply) {
const username = encodeURIComponent(request.params.username);
const listname = encodeURIComponent(request.params.listname);
const resource_id = request.query.resource_id;
const token = request.query.token;
console.log(request.query);
verify(token, username, {callback}, listname, resource_id, reply);
reply("Hello There..");
}
您可以使用上面的代码获取 params/query 数据。
我目前正在使用 hapi,我遇到了一个问题,我似乎找不到任何解决方案或以前提到过。当我发送以下请求时,只有我的第一个查询参数在 request.query 对象中。
curl -H "Content-Type: application/json" -X PUT https://localhost:3000/lists/{username}/{listname}?token='token'&resource_id='resource_id'
将 {}
和 ''
中的项目替换为实际名称。
我的路线目前是这样写的
server.route({
method: 'PUT',
path: '/lists/{username}/{listname}',
handler: function(request, reply) {
const username = encodeURIComponent(request.params.username);
const listname = encodeURIComponent(request.params.listname);
const resource_id = request.query.resource_id;
const token = request.query.token;
console.log(request.query);
verify(token, username, {callback}, listname, resource_id, reply);
}
});
console.log
调用的结果是
{ token: 'token' }
如果我执行 console.log(resource_id)
,我会在控制台中得到 "undefined"。 hapi 的文档指出所有查询参数都应在 request.query
对象中找到。由于某种原因,这没有发生。我查看了 hapijs 文档,查看了我的 API 调用,还阅读了人们处理查询参数的示例。知道这里发生了什么吗?
问题出在你的 curl 命令上,而不是 HapiJS。
尝试运行
curl -H "Content-Type: application/json" -X PUT "https://localhost:3000/lists/{username}/{listname}?token=token&resource_id=resource_id"
它是查询字符串中被解释为命令结束的符号。有关命令为何不起作用的解释,请参阅 this questions answer
问题在于触发 curl 请求。 curl请求中有&
,URL不在引号内;所以 &
变成 shell 修改后启动一个分离进程。您的路线运行良好,只需在引号
curl -H "Content-Type: application/json" -X PUT "https://localhost:3000/lists/{username}/{listname}?token='token'&resource_id='resource_id'"
如果你想从查询参数中获取数据,那么你应该像下面的代码那样做:
server.route({
method: 'PUT',
path: '/lists/{username}/{listname}',
validate: {
params: {
username: Joi.string().min(1).max(15).required(),
listname:Joi.string().min(1).max(15).required(),
},
query: {
token: Joi.number().integer().min(1).max(100).required(),
resource_id: Joi.number().integer().min(1).max(100).required(),
}
},
handler: function (request, reply) {
const username = encodeURIComponent(request.params.username);
const listname = encodeURIComponent(request.params.listname);
const resource_id = request.query.resource_id;
const token = request.query.token;
console.log(request.query);
verify(token, username, {callback}, listname, resource_id, reply);
reply("Hello There..");
}
您可以使用上面的代码获取 params/query 数据。