如何将分离的Koa-Routers与Typescript结合起来

时间:2017-10-15 10:45:16

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

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

路由器/ 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);

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

3 个答案:

答案 0 :(得分: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文件中。

答案 1 :(得分:0)

Meseret是我编写的一个很好的打字稿库,可以帮助您管理Koa服务器路由器,中间件等等。

E.g。您可以用此替换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路由器,然后将其添加到routers中的ServerApp列表中。

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

另外,它可以连接到MongoDB并帮助管理您的Mongoose模型(即使为您的猫鼬模型添加静态类型支持 - 路径,方法和静态 - 如果您使用{ {1}})。

配置中也支持

Socket.IO网络套接字。

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

meseret's Github page了解详情。

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

答案 2 :(得分:0)

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()