如何对查询字符串执行 GET 请求?
How do I perform a GET request on a query string?
我有一个餐厅预订项目,当您输入查询字符串时,例如:http://localhost:5000/reservations?2020-12-31
它会 return 当天的给定预订。
我正在使用 Knex 执行我的查询,我有第一个函数,它将 return 来自数据库的所有预订:
const listReservations = () => knex('reservations').select('*');
那我就试着拿这些,return指定的保留地:
const list = async (req, res) => {
const response = await service.listReservations();
const data = response.filter((reserve) => {
return Date.parse(reserve.reservation_date) - Date.now() > 0;
});
console.log(data);
res.json({ data });
};
数据如下:
[
{
"first_name": "Rick",
"last_name": "Sanchez",
"mobile_number": "202-555-0164",
"reservation_date": "2020-12-31",
"reservation_time": "20:00:00",
"people": 6,
"created_at": "2020-12-10T08:30:32.326Z",
"updated_at": "2020-12-10T08:30:32.326Z"
},
{
"first_name": "Frank",
"last_name": "Palicky",
"mobile_number": "202-555-0153",
"reservation_date": "2020-12-30",
"reservation_time": "20:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Bird",
"last_name": "Person",
"mobile_number": "808-555-0141",
"reservation_date": "2020-12-30",
"reservation_time": "18:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Tiger",
"last_name": "Lion",
"mobile_number": "808-555-0140",
"reservation_date": "2025-12-30",
"reservation_time": "18:00",
"people": 3,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Anthony",
"last_name": "Charboneau",
"mobile_number": "620-646-8897",
"reservation_date": "2026-12-30",
"reservation_time": "18:00",
"people": 2,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
}
]
如果我解析我的日期,减去今天的日期和 return 0 以上的日期,我得到:Tiger 和 Anthony。如果我 return 0 以下的我得到前三个名字。
测试用例作为查询字符串在 2020-12-31 中传递,期待 Rick。如何执行给定查询字符串的 GET 请求?
试试这个查询:knex('reservations').where({'reservation_date':'2020-12-31'})
。有关详细信息,请参阅 knex documentation。
在 Express 中,您可以使用 req.query
访问 url 的查询参数(?
之后的所有内容)。但这只有在您的查询字符串格式正确时才有效。它需要具有这样的格式:?field=value&foo=bar&date=2020-12-31
.
一旦你有一个 url 以这种方式格式化查询,Express 就可以解析它,你可以像这样使用它:
knex('reservations').where({ 'reservation_date': req.query.date })
这是推荐的解决方案(加上我留作 reader 练习的一些参数化重构)。但是如果更改查询字符串的格式不是一个选项,那么您可以改为对 req.originalUrl
进行一些字符串处理,如下所示:
const indexOfQs = req.originalUrl.indexOf('?')
const date = indexOfQs === -1 ? null : req.originalUrl.substr(indexOfQs + 1)
knex('reservations').where({ 'reservation_date': date })
我不熟悉 Knex,为了避免不必要地加载所有记录并在客户端进行过滤,我发现 Wazeed 的答案是正确的,但是如果您尝试过滤,您可以简单地按 reservation_date 字符串。请尝试以下示例
顺便说一下,在您分享的示例中,我看不到您在这种情况下从何处获取查询字符串的值 2020-12-31
const data = [
{
"first_name": "Rick",
"last_name": "Sanchez",
"mobile_number": "202-555-0164",
"reservation_date": "2020-12-31",
"reservation_time": "20:00:00",
"people": 6,
"created_at": "2020-12-10T08:30:32.326Z",
"updated_at": "2020-12-10T08:30:32.326Z"
},
{
"first_name": "Frank",
"last_name": "Palicky",
"mobile_number": "202-555-0153",
"reservation_date": "2020-12-30",
"reservation_time": "20:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Bird",
"last_name": "Person",
"mobile_number": "808-555-0141",
"reservation_date": "2020-12-30",
"reservation_time": "18:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Tiger",
"last_name": "Lion",
"mobile_number": "808-555-0140",
"reservation_date": "2025-12-30",
"reservation_time": "18:00",
"people": 3,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Anthony",
"last_name": "Charboneau",
"mobile_number": "620-646-8897",
"reservation_date": "2026-12-30",
"reservation_time": "18:00",
"people": 2,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
}
];
const output = data.filter(value => value.reservation_date === "2020-12-31");
console.log(output)
我有一个餐厅预订项目,当您输入查询字符串时,例如:http://localhost:5000/reservations?2020-12-31
它会 return 当天的给定预订。
我正在使用 Knex 执行我的查询,我有第一个函数,它将 return 来自数据库的所有预订:
const listReservations = () => knex('reservations').select('*');
那我就试着拿这些,return指定的保留地:
const list = async (req, res) => {
const response = await service.listReservations();
const data = response.filter((reserve) => {
return Date.parse(reserve.reservation_date) - Date.now() > 0;
});
console.log(data);
res.json({ data });
};
数据如下:
[
{
"first_name": "Rick",
"last_name": "Sanchez",
"mobile_number": "202-555-0164",
"reservation_date": "2020-12-31",
"reservation_time": "20:00:00",
"people": 6,
"created_at": "2020-12-10T08:30:32.326Z",
"updated_at": "2020-12-10T08:30:32.326Z"
},
{
"first_name": "Frank",
"last_name": "Palicky",
"mobile_number": "202-555-0153",
"reservation_date": "2020-12-30",
"reservation_time": "20:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Bird",
"last_name": "Person",
"mobile_number": "808-555-0141",
"reservation_date": "2020-12-30",
"reservation_time": "18:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Tiger",
"last_name": "Lion",
"mobile_number": "808-555-0140",
"reservation_date": "2025-12-30",
"reservation_time": "18:00",
"people": 3,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Anthony",
"last_name": "Charboneau",
"mobile_number": "620-646-8897",
"reservation_date": "2026-12-30",
"reservation_time": "18:00",
"people": 2,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
}
]
如果我解析我的日期,减去今天的日期和 return 0 以上的日期,我得到:Tiger 和 Anthony。如果我 return 0 以下的我得到前三个名字。
测试用例作为查询字符串在 2020-12-31 中传递,期待 Rick。如何执行给定查询字符串的 GET 请求?
试试这个查询:knex('reservations').where({'reservation_date':'2020-12-31'})
。有关详细信息,请参阅 knex documentation。
在 Express 中,您可以使用 req.query
访问 url 的查询参数(?
之后的所有内容)。但这只有在您的查询字符串格式正确时才有效。它需要具有这样的格式:?field=value&foo=bar&date=2020-12-31
.
一旦你有一个 url 以这种方式格式化查询,Express 就可以解析它,你可以像这样使用它:
knex('reservations').where({ 'reservation_date': req.query.date })
这是推荐的解决方案(加上我留作 reader 练习的一些参数化重构)。但是如果更改查询字符串的格式不是一个选项,那么您可以改为对 req.originalUrl
进行一些字符串处理,如下所示:
const indexOfQs = req.originalUrl.indexOf('?')
const date = indexOfQs === -1 ? null : req.originalUrl.substr(indexOfQs + 1)
knex('reservations').where({ 'reservation_date': date })
我不熟悉 Knex,为了避免不必要地加载所有记录并在客户端进行过滤,我发现 Wazeed 的答案是正确的,但是如果您尝试过滤,您可以简单地按 reservation_date 字符串。请尝试以下示例
顺便说一下,在您分享的示例中,我看不到您在这种情况下从何处获取查询字符串的值 2020-12-31
const data = [
{
"first_name": "Rick",
"last_name": "Sanchez",
"mobile_number": "202-555-0164",
"reservation_date": "2020-12-31",
"reservation_time": "20:00:00",
"people": 6,
"created_at": "2020-12-10T08:30:32.326Z",
"updated_at": "2020-12-10T08:30:32.326Z"
},
{
"first_name": "Frank",
"last_name": "Palicky",
"mobile_number": "202-555-0153",
"reservation_date": "2020-12-30",
"reservation_time": "20:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Bird",
"last_name": "Person",
"mobile_number": "808-555-0141",
"reservation_date": "2020-12-30",
"reservation_time": "18:00",
"people": 1,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Tiger",
"last_name": "Lion",
"mobile_number": "808-555-0140",
"reservation_date": "2025-12-30",
"reservation_time": "18:00",
"people": 3,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
},
{
"first_name": "Anthony",
"last_name": "Charboneau",
"mobile_number": "620-646-8897",
"reservation_date": "2026-12-30",
"reservation_time": "18:00",
"people": 2,
"created_at": "2020-12-10T08:31:32.326Z",
"updated_at": "2020-12-10T08:31:32.326Z"
}
];
const output = data.filter(value => value.reservation_date === "2020-12-31");
console.log(output)