首页 > 解决方案 > 如何在快递中手动注册基于分类的路线

问题描述

我正在使用 express 构建一个框架应用程序,并尝试将我的端点编写为类以提高清晰度和可扩展性:

module.exports = class MyRoute {
    method = 'get';
    url = '/stuff';

    constructor(someService) {
        this.someService = someService;
    }

    async handler(req, res, next) {
        // handle request and response
    }
}

但是,如果我这样做,我怎样才能快速注册这些路线?我以前在以前的工作中看到过它,但我不记得怎么做!

标签: apiexpressclassecmascript-6routes

解决方案


目前还不清楚你到底想要什么,我可以想出很多方法来利用这种设计。

但我认为这就是你想要的,因为你有你的班级method并且url属性。

routeModule.js文件:

module.exports = class MyRoute {
    method = 'get';
    url = '/stuff';

    constructor(someService) {
        this.someService = someService;
    }

    async handler(req, res, next) {
        // handle request and response
    }
}

index.js文件或您注册路线的任何地方:

const routeModule = new (require("./path/to/routeModule"))();

app[routeModule.method](routeModule.url, routeModule.handler);

method该代码将通过名称和动态注册您的路线url,结果将等同于

app.get("/stuff", routeModule.handler);

如果您手动注册大量路由,我想到了一些可能会使您的代码更清晰的方法。我在快速客户端上创建了一个函数来注册一个路由模块:

const app = express();

app.addRouteModule = function(s) {
    this[s.method](s.url, s.handler);
}

然后你可以很容易地调用它来注册一个类作为一个新的路由:

const routeModuleA = new (require("./path/to/routeModuleA"))();
const routeModuleB = new (require("./path/to/routeModuleB"))();
const routeModuleC = new (require("./path/to/routeModuleC"))();

app.addRouteModule(routeModuleA);
app.addRouteModule(routeModuleB);
app.addRouteModule(routeModuleC);

// or
app.addRouteModule(new (require("./path/to/routeModuleA"))());
app.addRouteModule(new (require("./path/to/routeModuleB"))());
app.addRouteModule(new (require("./path/to/routeModuleC"))());

推荐阅读