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“未找到”
我们正在使用 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“未找到”