Restify 返回 405 而不是 404

Restify is returning 405 instead of 404

我们正在使用 restify 6.4.0,而不是 404 对于不存在的端点,我们得到 405(不允许的方法)。

我已经确定了这一行的核心问题server.opts('.*', (req, res) => res.send(204));。出于某种原因,当它存在时,就会出现 405 问题。当我删除它时,restify 开始按预期工作(404 用于不存在的端点,405 用于具有不同 HTTP 方法的现有端点)

这是工作示例

var restify = require('restify');

const server = restify.createServer({
  name: 'myapp',
  version: '1.0.0'
});

server.use(restify.plugins.acceptParser(server.acceptable));
server.use(restify.plugins.queryParser());
server.use(restify.plugins.bodyParser());

server.opts('.*', (req, res) => res.send(204));

server.get('/echo/:name', function (req, res, next) {
  res.send(req.params);
  return next();
});

server.listen(8080, function () {
  console.log('%s listening at %s', server.name, server.url);
});

当我使用 postman 并调用 localhost:8080/noo 时,这是响应

{
    "code": "MethodNotAllowed",
    "message": "GET is not allowed"
}

然而,当我删除 server.opts('.*', (req, res) => res.send(204)); 行时,我得到了预期的结果

{
    "code": "ResourceNotFound",
    "message": "/noo does not exist"
}

我不清楚为什么会这样 - 尝试了 Postman 和另一个 Node.js 代码以确保它不是由 Chrome 或其他浏览器完成的一些飞行前请求引起的。使用此代码调用服务器:

var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://localhost:8080/noo',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

我收到了这个回复

{"code":"MethodNotAllowed","message":"GET is not allowed"}

(和邮递员一样,当我删除 server.opts... 行时,我得到正确的响应

{"code":"ResourceNotFound","message":"/noo does not exist"}

谁能解释一下发生了什么?

行:

server.opts('.*', (req, res) => res.send(204));

是对所有 HTTP OPTONS 请求的 return 204 响应的捕获所有处理程序。

看起来这导致 restify 总是得出结论,你确实有一个给定路由的处理程序(因为它是每条路由的全部),只是不是被要求的方法 - 即除了 OPTIONS 之外的任何东西请求。

因此您得到 405“方法不允许”而不是 404“未找到”