Nodejs Express - 对于不受支持的方法返回 405

Dav*_*aiz 2 node.js express

我正在使用 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)

请指教。

dwh*_*ieb 6

您可以简单地将.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 路由

如果您想确保用户已登录所有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)