在特定路由上有效使用身份验证中间件Node.js/Express

lstz6jyr  于 2023-03-01  发布在  Node.js
关注(0)|答案(1)|浏览(135)

我正在建立一个WEB应用程序,后端与Node.js和Express。我已经建立了一个认证中间件,检测用户是否登录与jwt,我希望一些路由使用它(保护)和一些不(公共),但重复它在每个路由似乎太健壮和过时。例如,这是我的routes.js:

import express from "express";
import authenticateUser from "../../Middlewares/auth.js";
import controller from "./controller.js";

const router = express.Router();

router.get("/searchFor/:term", controller.searchFor);

router.get("/myList", authenticateUser, controller.getMyList);
router
  .route("/myList/:id")
  .get(authenticateUser, controller.isInList)
  .post(authenticateUser, controller.addToList)
  .delete(authenticateUser, controller.removeFromList);

“searchFor”路由是公共的,所以我不希望auth中间件在那里运行,因此我没有使用router.use(authenticateUser)。
我以为我可以做这样的事

router
 .route("/myList/:id", authenticateUser)
 .get(controller.isInList)
 .post(controller.addToList)
 .delete(controller.removeFromList);

这样我就不用每次都重复auth中间件了,但是它不起作用,所以我回到了第一个选项。有没有更好的方法?

1qczuiv0

1qczuiv01#

您可以使用路由器的.all方法将中间件应用于所有路由。

router
 .route("/myList/:id")
 .all(authenticateUser)
 .get(controller.isInList)
 .post(controller.addToList)
 .delete(controller.removeFromList);

查看此处的文档:https://expressjs.com/en/4x/api.html#router.route
当你的应用增长并拥有大量路由时,你可以创建某种类型的配置对象,在其中你可以轻松定义新路由并设置它们是否是公共的。然后,让代码遍历整个对象并调用适当的路由器方法来配置你的路由器。
下面是它可能的样子(我还没有检查或测试这个代码,虽然):

const routesConfiguration = [
    {
        path: "/myList/:id", public: false, methods: [ 
            { method: "get", controller: controller.isInList },
            { method: "post", controller: controller.addToList }]
    },
    {
        path: "/searchFor/:term", public: true, methods: [
            { method: "get", controller: controller.searchFor }
        ]
    }
];

routesConfiguration.forEach(route => {

    router.route(route.path);

    if (route.public) {
        router.all(authenticateUser);
    }
    
    route.methods.forEach(routeMethod => {
        if (routeMethod.method === "get") {
           router.get(routerMethod.controller);
        }
        if (routeMethod.method === "post") {
           router.post(routerMethod.controller);
        }
    });
});

使用类似上面的代码,您可以向routesConfiguration列表添加新条目。

相关问题