簡體   English   中英

如何將分隔的Koa-Router與Typescript結合

[英]How to combine separated Koa-Routers with Typescript

我決定按用途划分路由器,因此它們如下所示:

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

我不知道如何導出路由器來實現這一目標。 有人可以幫忙嗎?

你可以有這樣的事情:

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文件中。

Meseret是我寫的一個不錯的打字稿庫,可以幫助您管理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 ,也可以向您的Mongoose模型添加靜態類型支持(路徑,方法和靜態ModelFactory ))。

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

所有這些功能都在單個ServerApp實例中進行管理。

meseret的Github頁面上找到更多信息。

我希望它可以幫助您管理分布式節點服務器項目。

不久前制作了一個實用程序,用於將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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM