我正在使用 Express 运行标准的 NodeJs 8,目前当请求现有路径但不受支持的方法进来时,Express 返回 404。
例如支持 'POST /login',但不支持 'GET /login',但返回 404。
在这种情况下,如何让 Express 返回 405?
这是路由文件:
const express = require('express');
const router = express.Router();
const loginController = require('../controllers/login');
router.route('/login').post(loginController.loginUser);
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
请指教。
您可以简单地将.all()处理程序添加到您的路由链中,如下所示:
const methodNotAllowed = (req, res, next) => res.status(405).send();
router
.route(`/login`)
.post(loginController.loginUser)
.all(methodNotAllowed);
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为请求是按照它们附加到路由的顺序(请求“瀑布”)传递给处理程序的。该.post()处理器将抓住你的POST请求,其余的都将落空的.all()处理程序。
另请参阅此问题以获取更多详细信息。
如果您想确保用户已登录所有POST 请求,但对任何其他请求返回 405 响应,您可以使用正则表达式将所有路由与 匹配router.post('*'),如下所示:
router
.post(`*`, loginController.loginUser)
.all(methodNotAllowed);
Run Code Online (Sandbox Code Playgroud)
然而,这种方法的问题是不会向客户端返回 404 错误,只会返回 405。因此,我建议将methodNotAllowed处理程序附加到每个单独的路由,就像上面的第一个代码片段一样。对于不存在的路由,此方法将返回 404 错误,但对于存在的路由将返回 405 错误。
要确定路由允许使用哪些方法,请使用router.stack:
app.use((req, res, next) => {
const methods = router.stack
// Filter for the route that matches the currently matched route
.filter(layer => layer.route.path === req.path)[0]
.route
.methods;
if (!methods[req.method]) methodNotAllowed(req, res, next);
else next();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2233 次 |
| 最近记录: |