json-server returns 对于查询参数过滤的 GET 请求,HTTP 200 而不是 404,这里的最佳实践是什么?如何返回 404?

json-server returns HTTP 200 instead of 404 for query parameter filtered GET request, what is the best practice here & how can 404 be returned?

上下文

正在尝试发出一个 HTTP GET 请求 post 由查询参数 authorId=x 筛选,其中 x 可能是一个数字,可能不对应于任何 post的authorId.

问题

json-server 意外地 returns HTTP 200 而不是 HTTP 404 响应,当没有 posts 匹配 authorId (即空数组是 returned),如何将其更改为 return 404?同样,这里最好的 API 做法是 return 一个带有 HTTP 400 的空数组,就像 json-server 已经做的或将会 returning带有 HTTP 404 的空数组对用户来说更清楚吗?

我查看了 jsonServer.rewriter & express 中间件(例如,json-server 文档显示它可以使用 server.use(middlewares) 等中间件进行配置)但想问这里最好的方法是什么(有用的 resources/links 在这里会受到赞赏),例如,使用中间件,一个选项是为空数组发送 404 但是 json-server 有内置的方法来处理这个还是有更好的方法?

欢迎所有建设性的反馈,谢谢。

代码

db.json:

{
    "posts": [
        {
            "authorId": 0,
            "content": "Foo bar"
        },
    ],
}

Shell:

json-server --watch db.json

休息:

// Response status is expected HTTP 200.
GET http://localhost:5000/posts?authorId=0

这 return 使用 HTTP 200 的用户符合预期:

[
  {
      "authorId": 0,
      "content": "Foo bar",
  }
]
// Response status is unexpected HTTP 200 but 404 was expected since response body contains an empty array. This is the problem.
GET http://localhost:5000/posts?authorId=does_not_exist

这 return 是一个带有 HTTP 200 的空数组,这可能是意外的(不确定关于没有匹配项的过滤集合的最佳做法是什么,但最佳做法是什么here & 如何将状态更改为 HTTP 400:

[]

正如@kindall 指出的那样,return 404 可能是不明智的,但也许这是您正在嘲笑的 API 的现有行为。您可以 return 自定义输出 - 来自文档:https://github.com/typicode/json-server#custom-output-example

// In this example we simulate a server side error response
router.render = (req, res) => {
  res.status(500).jsonp({
    error: "error message here"
  })
}

对于您的示例,它可能类似于(未经测试的伪代码):

// In this example we return 404 for no content
router.render = (req, res) => {
  if (res.locals.data.posts.length < 1) {
    res.status(404).jsonp({
      error: "no posts"
    });
  } else {
    res.jsonp(res.locals.data);
  }
}