首页 > 解决方案 > 如何将我的 koa 路由拆分为单独的文件?中间件问题

问题描述

我正在尝试将 koa 路由拆分为单独的文件。我对路由有这样的文件夹结构。

routes/
   __index.js
   auth.js
   user.js

因此,如果尝试使用方法一意味着它工作得很好。但是使用方法 2 的动态方式意味着它不能正常工作。所有路由都被击中,这不是问题,但同时对于auth路由,它也在middleware.isAuthorized内部。

方法一

const routesToEnable = {
    authRoute: require('./auth'),
    userRoute: require('./user')
};

for (const routerKey in routesToEnable) {
    if (routesToEnable[routerKey]) {
        const nestedRouter = routesToEnable[routerKey];
        if (routerKey == 'authRoute') {
            router.use(nestedRouter.routes(), nestedRouter.allowedMethods());
        } else {
            router.use(middleware.isAuthorized, nestedRouter.routes(), nestedRouter.allowedMethods());
        }
    }
}

module.exports = router;

方法二

fs.readdirSync(__dirname)
    .filter(file => (file.indexOf(".") !== 0 && file !== '__index.js' && file.slice(-3) === ".js"))
    .forEach(file => {
        // console.info(`Loading file ${file}`);
        const routesFile = require(`${__dirname}/${file}`);
        switch (file) {
            case 'auth.js':
                router.use(routesFile.routes(), routesFile.allowedMethods());
                break;
            default:
                router.use(middleware.isAuthorized, routesFile.routes(), routesFile.allowedMethods());
                break;
        }
    });

module.exports = router;

我如何在没有中间件的情况下将方法二用于身份验证路由本身。谁能建议我在这里做错了什么。提前致谢。

标签: node.jskoakoa-router

解决方案


问题自行解决。以前我曾经在同一行中将路由与中间件结合起来。

router.use(middleware.isAuthorized, routesFile.routes(), routesFile.allowedMethods());

但这是我用来定义路线的错误方式。router.use()将中间件用于所有路由。所以现在我只是将我的路由分成单独的路由器使用单独的路径。文档中提到的Koa 路由器

已解决的答案

fs.readdirSync(__dirname)
  .filter(file => (file.indexOf(".") !== 0 && file !== '__index.js' && file.slice(-3) === ".js"))
  .forEach(file => {
    const routesFile = require(`${__dirname}/${file}`);
    if (file !== 'auth.js') {
      routesFile.stack.forEach(elem => { router.use(elem.path, middleware.isAuthorized); });
    }
    router.use(routesFile.routes(), routesFile.allowedMethods());
  });

推荐阅读