【问题标题】:Restify is returning 405 instead of 404Restify 返回 405 而不是 404
【发布时间】:2026-02-19 06:15:01
【问题描述】:

我们使用的是 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);
});

当我使用邮递员并拨打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"}

有人可以解释发生了什么吗?

【问题讨论】:

    标签: javascript node.js request cors restify


    【解决方案1】:

    行:

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

    是一个捕获所有处理程序,用于为所有 HTTP OPTONS 请求返回 204 响应。

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

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

    【讨论】:

      最近更新 更多