【问题标题】:How to combine separated Koa-Routers with Typescript如何将分离的 Koa-Router 与 Typescript 结合起来
【发布时间】:2018-03-27 00:31:10
【问题描述】:

我决定按用途拆分路由器,所以它们看起来像这样:

routers/homeRouter.ts

import * as Router from 'koa-router';

const router: Router = new Router();

router
    .get('/', async (ctx, next) => {
        ctx.body = 'hello world';
    });

export = router;

路由器/userRouter.ts

import * as Router from 'koa-router';
import UserController = require('../controller/userController');

const router: Router = new Router(
    {
        prefix: 'users'
    }
);

var userController = new UserController();

router
    .post('/user/:email/:password', userController.signUp);

export = router;

有了这个,我的 app.ts 必须像这样一个一个地导入每个路由器:

app.ts

import * as Koa from 'koa';
import * as homeRouter from './routers/homeRouter';
import * as userRouter from './routers/userRouter';
const app: Koa = new Koa();
app
    .use(homeRouter.routes())
    .use(homeRouter.allowedMethods());
app
    .use(userRouter.routes())
    .use(userRouter.allowedMethods());
app.listen(3000);

但我想要的是这样的:

app.ts

import * as Koa from 'koa';
import * as routers from './routers';
const app: Koa = new Koa();
app
    .use(routers.routes())
    .use(routers.allowedMethods());
app.listen(3000);

我不知道如何导出路由器来实现这个。有人可以帮忙吗?

【问题讨论】:

  • 前段时间我为此写了一个实用程序,我在answer 中谈到了它,以防你好奇。
  • @saadq bit 你会怎么用 Typescript 做呢?

标签: typescript export koa koa-router code-separation


【解决方案1】:

你可以有这样的东西:

userRouter.ts

import * as Router from 'koa-router';

const router = new Router();
router.get('/', list);

...

export default router.routes();

routes.ts

import * as Router from 'koa-router';


import UserRouter from './userRouter';
import HomeRouter from './homeRouter';

const apiRouter = new Router({ prefix: '/api'});
apiRouter.use('/users', UserRouter);
apiRouter.use('/home', HomeRouter);

export default apiRouter.routes();

您可以像以前那样单独实现每个路由器,然后生成一个包含所有路由器的新路由器。然后您可以将其包含在您的app.ts 文件中。

【讨论】:

    【解决方案2】:

    Meseret 是我编写的一个不错的 typescript 库,可以帮助您管理 Koa 服务器路由器、中间件等等。

    例如你可以用这个替换你的app.ts

    import { ServerApp } from 'meseret'
    
    import HomeRouter from './routers/homeRouter'
    import UserRouter from './routers/userRouter'
    
    new ServerApp({
      name: 'Your App Name',
      httpServers: [
        { port: 3000 }
      ],
      routers: [
        HomeRouter,
        UserRouter
      ]
    }).start() // returns a Promise
    

    您所要做的就是导入您的koa-router 路由器并将它们添加到ServerApp 中的routers 列表中。

    Meseret 不仅可以帮助您管理路由器。它内置了对 Koa 会话、静态缓存、公共目录服务、响应压缩等的支持。正如预期的那样,还有一个选项可以让您将自己的 Koa 中间件添加到应用程序中。

    另外,它可以连接到MongoDB 并帮助管理您的Mongoose 模型(甚至通过为您的猫鼬模型添加静态类型支持——路径、方法和静态——如果你使用ModelFactory)。

    配置中也支持Socket.IO web sockets。

    所有这些功能都在单个 ServerApp 实例中进行管理。

    通过meseret's Github page了解更多信息。

    希望它可以帮助您管理您的分布式节点服务器项目。

    【讨论】:

      【解决方案3】:

      I made a utility 不久前将koa-router 的多个实例组合到一个中间件中,我刚刚添加了一个 TypeScript 定义文件,所以它应该可以用于 TS 人员。只需npm install koa-combine-routers 并像这样使用它:

      用法:

      app.js

      import * as Koa from 'koa'
      import router from './router'
      
      const app = new Koa()
      
      app.use(router())
      

      routes.js

      import * as Router from 'koa-router'
      import * as combineRouters from 'koa-combine-routers'
      
      const dogRouter = new Router()
      const catRouter = new Router()
      
      dogRouter.get('/dogs', async ctx => {
        ctx.body = 'ok'
      })
      
      catRouter.get('/cats', async ctx => {
        ctx.body = 'ok'
      })
      
      const router = combineRouters(
        dogRouter, 
        catRouter
      )
      
      export default router
      

      这将同时使用.routes().allowedMethods()

      【讨论】:

        猜你喜欢
        • 2020-05-02
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 2022-11-26
        • 2019-12-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        相关资源
        最近更新 更多