代码之家  ›  专栏  ›  技术社区  ›  David Faizulaev

nodejs express-对于不支持的方法返回405

  •  1
  • David Faizulaev  · 技术社区  · 7 年前

    我正在用Express运行标准的nodejs 8,当一个对现有路径但不受支持的方法的请求出现时,Express返回404。

    例如,支持“post/login”,但不支持“get/login”,但返回404。

    在这种情况下,我怎么做405号特快专递呢?

    这是路由文件:

    const express = require('express');
    const router = express.Router();
    const loginController = require('../controllers/login');
    
    
    router.route('/login').post(loginController.loginUser);
    
    module.exports = router;
    

    请告知。

    2 回复  |  直到 7 年前
        1
  •  2
  •   dwhieb    7 年前

    您可以简单地添加 .all() 您的路由链的处理程序,如下所示:

    const methodNotAllowed = (req, res, next) => res.status(405).send();
    
    router
    .route(`/login`)
    .post(loginController.loginUser)
    .all(methodNotAllowed);
    

    解释

    这是因为请求按连接到路由的顺序(请求“瀑布”)传递给处理程序。这个 .post() 处理程序将捕获您的post请求,其余的将通过 () 处理程序。

    另请参见 this question 了解更多详细信息。

    正在验证 全部的 发布路线

    如果要确保用户登录 全部的 发布请求,但对于任何其他请求返回405响应,可以使用正则表达式将所有路由与 router.post('*') ,就像这样:

    router
    .post(`*`, loginController.loginUser)
    .all(methodNotAllowed);
    

    然而,这种方法的问题在于,不会向客户机返回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();
    
    });
    
        2
  •  1
  •   KarlR    7 年前

    你可以这样做:

    app.route("/login")
      .get((req, res) => {
        /* HANDLE GET */
      })
      .post((req, res) => {
        /* HANDLE POST */
      })
      .all((req, res) => {
        res.status(405).send();
      });
    

    它是如何工作的?

    如果请求与路由匹配。它将经过处理程序。如果存在处理程序,将使用该特定的处理程序来处理。否则,它将到达“all”处理程序,该处理程序将状态代码设置为405并发送响应。

    您可以在这里找到关于它的讨论: 405 issue

    @您的问题如下:

    你可以这样做:

    loginroutes.js内容:

    const router = require('express').Router();
    
    router.route('/')
      .get((req, res) => {
        res.status(200).send()
      })
    
    module.exports = router
    

    服务器文件内容:

    const express = require('express')
    const app = express();
    const router = express.Router();
    const loginRoutes = require('./loginRoutes')
    
    const PORT = process.env.PORT || 8080;
    
    router.use('/login', loginRoutes)
    router.route('/login').all((req, res) => { res.status(405).send() })
    app.use(router);
    
    app.listen(PORT, () => console.log(`started on port: ${PORT}`))
    
    推荐文章