如何对查询字符串执行 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)