【问题标题】:How do I perform a GET request on a query string?如何对查询字符串执行 GET 请求?
【发布时间】:2021-04-08 07:13:07
【问题描述】:

我有一个餐厅预订项目,当您输入查询字符串时,例如:http://localhost:5000/reservations?2020-12-31,它将返回当天给定的预订。

我正在使用 Knex 执行我的查询,并且我有第一个函数,它将返回数据库中的所有预订:

const listReservations = () => knex('reservations').select('*');

然后我尝试把这些,并返回指定的保留:

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"
  }
]

如果我解析我的日期,减去今天的日期并返回 0 以上的日期,我得到:Tiger 和 Anthony。如果我返回低于 0 的值,我会得到前三个名称。

测试用例在 2020 年 12 月 31 日作为查询字符串传递,并期待 Rick。如何执行给定查询字符串的 GET 请求?

【问题讨论】:

  • 您还应该考虑使用.where('reservation_date', '>', new Date())where 子句添加到您的sql 查询中,而不是对结果执行filter()

标签: javascript express knex.js


【解决方案1】:

在 Express 中,您可以使用req.query 访问 url 的查询参数(? 之后的所有内容)。但这只有在您的查询字符串格式正确时才有效。它需要有这样的格式:?field=value&foo=bar&date=2020-12-31

一旦你有一个带有这种格式的查询的 url,Express 可以解析它,你可以像这样使用它:

knex('reservations').where({ 'reservation_date': req.query.date })

这是推荐的解决方案(加上一些参数化重构,我留给读者作为练习)。但如果更改查询字符串的格式不是一个选项,那么您可以改为对req.originalUrl 进行一些字符串处理,如下所示:

const indexOfQs = req.originalUrl.indexOf('?')
const date = indexOfQs === -1 ? null : req.originalUrl.substr(indexOfQs + 1)
knex('reservations').where({ 'reservation_date': date })

【讨论】:

    【解决方案2】:

    试试这个查询:knex('reservations').where({'reservation_date':'2020-12-31'})。更多信息请参考knex documentation

    【讨论】:

    • 所以我已经实现了这一点,并将我的控制器列表函数中的过滤器方法更改为:const data = response.filter((reserve) => { return Date.parse(reserve.reservation_date); }); 这使测试通过但现在它是硬编码的,所以即使没有查询字符串我只得到那一个预订。
    • 这个我给了例如。您需要从 get 方法处理程序中的请求查询中获取日期,并将其发送到 knex。
    【解决方案3】:

    我不熟悉 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)

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 2016-05-04
      • 2021-03-22
      • 2020-06-30
      • 2013-04-06
      • 2014-06-15
      • 2019-05-29
      相关资源
      最近更新 更多