3

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

路由器/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 必须像这样一个一个地导入每个路由器:

应用程序.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);

但我想要的是这样的:

应用程序.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);

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

4

3 回答 3

4

你可以有这样的东西:

用户路由器.ts

import * as Router from 'koa-router';

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

...

export default router.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文件中。

于 2017-10-19T08:13:44.297 回答
1

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路由器并将它们添加routersServerApp.

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

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

配置中还支持Socket.IO Web 套接字。

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

在meseret 的 Github 页面上了解更多信息。

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

于 2017-11-17T11:48:24.213 回答
1

不久前我制作了一个实用程序,用于将多个实例组合koa-router到一个中间件中,我刚刚添加了一个 TypeScript 定义文件,因此它应该可供 TS 人员使用。就像npm install koa-combine-routers这样使用它:

用法:

应用程序.js

import * as Koa from 'koa'
import router from './router'

const app = new Koa()

app.use(router())

路由.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()

于 2018-04-03T01:55:22.747 回答