gpt4 book ai didi

express - 当有路由匹配但没有 HTTP 方法匹配时从 express.js 发送 405

转载 作者:行者123 更新时间:2023-12-03 14:41:36 25 4
gpt4 key购买 nike

如果客户端发送的请求与映射的 url 路由匹配但与映射的 HTTP 方法不匹配,我正在寻找一种干净的方法让我的快速应用程序返回 405 Method Not Allowed。

我当前的实现是有一个默认的“catch-all”处理程序,它试图将 url 与注册路由匹配,忽略 HTTP 方法。如果匹配,那么我们知道返回 405,否则我们让 express 执行其默认的 404 行为。

我希望有一种更好的方法,它不涉及运行所有路线匹配两次(一次通过 express ,一次通过我的处理程序)。

最佳答案

方法一:使用.route().all()

// Your route handlers
const handlers = require(`./handlers.js`);

// The 405 handler
const methodNotAllowed = (req, res, next) => res.status(405).send();

router
.route(`/products`)
.get(handlers.getProduct)
.put(handlers.addProduct)
.all(methodNotAllowed);


这是可行的,因为请求按照它们附加到路由的顺序传递给处理程序(请求“瀑布”)。 .get().put()处理程序将捕获 GET 和 PUT 请求,其余的将通过 .all()处理程序。

方法二:中间件

创建检查允许方法的中间件,如果方法未列入白名单,则返回 405 错误。这种方法很好,因为它允许您查看和设置每条路线的允许方法以及路线本身。

这是 methods.js中间件:

const methods = (methods = ['GET']) => (req, res, next) => {
if (methods.includes(req.method)) return next();
res.error(405, `The ${req.method} method for the "${req.originalUrl}" route is not supported.`);
};

module.exports = methods;


然后您将使用 methods你的 route 的中间件是这样的:

const handlers = require(`./handlers.js`); // route handlers
const methods = require(`./methods.js`); // methods middleware

// allows only GET or PUT requests
router.all(`/products`, methods([`GET`, `PUT`]), handlers.products);

// defaults to allowing GET requests only
router.all(`/products`, methods(), handlers.products);

关于express - 当有路由匹配但没有 HTTP 方法匹配时从 express.js 发送 405,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com