IWinter 一個路由轉控制器的 Nodejs 庫

yvanwangl發表於2017-11-14

IWinter 是一個路由轉控制器的 node 庫,只解決一個問題:為了讓使用者以更優雅的姿勢進行路由的編寫。支援在 Express 和 Koa 中使用。

專案地址

簡介:

最近在學習使用 Typescript ,打算把以前寫的部落格管理後臺用 Typescript 進行全面重構,在重構服務端程式碼時接觸到了 Typescript 的裝飾器功能。可以用裝飾器對路由進行一層包裝,然後就可以這樣編寫路由:

import {Path, GET, POST, PathParam, BodyParam} from 'iwinter';

@Path('/api/orders')
class OrdersController {

    @GET
    @Path('/:name/:id', (ctx, next)=> ~~ctx.params.id > 20)
       getAllOrders(@PathParam('id') id: number, @PathParam('name') name: string){
        return [{
               id: id, name, content: 'test', author: 'test', comments: []
           }];
    }

    @POST
    @Path('/add')
    addPost(@BodyParam('order') order: object){
        return order;
    }
}

export default OrdersController;複製程式碼

由於工作中會使用 Java 編寫控制層程式碼(Spring MVC 的控制層程式碼),所以看到這樣的程式碼簡直太親切了。而且相較於以前的路由編寫方式更清晰,更方便維護,所以就將原來的的程式碼進行了改造。我使用之後發現非常好用,我就想讓更多的人都可以使用,所以就誕生了 IWinter 這個庫。IWinter 就是將各種裝飾器或裝飾器工廠函式進行封裝然後暴露出一些 API 供大家使用。從此就告別這樣編寫路由了 ;)

//app.js
...
let users = require('./routes/users');
let orders = require('./routes/orders');

app.use('/api/users', users);
app.use('/api/orders', orders);
...

//routers/orders.js
...
router.route('/')
    .get(function (req, res, next) {
        let {page, timeRange, customerId, orderNumber} = req.query;
        let limit = constants.PAGE_SIZE;
        let skip = (page - 1) * limit;
        let currentUser = global[Symbol.for('currentUser')];
        let queryCondition = {
            userId: currentUser['_id']
        };
           ...複製程式碼

誰適合使用 IWinter:

* Nodejs 使用者
* Typescript 使用者
* Express / Koa 使用者

IWinter 安裝 及 使用

npm install --save iwinter複製程式碼
import IWinter from 'iwinter';複製程式碼

Koa 中如何使用:

import * as Router from 'koa-router';
...
app.use(new IWinter({
       engine: 'koa',
    router: new Router(),
    dir: path.join(__dirname, 'controller')
}).controller());
...複製程式碼

Express 中如何使用:

import * as express from 'express';
let app = express();
let router = express.Router();
...
new IWinter({
    engine: 'express',
    router: app,
    dir: path.join(__dirname, 'controller'),
       prefix: ''
}).controller();複製程式碼

使用示例

Express 示例
Koa 示例

詳細配置可以檢視 專案 README

喜歡的話,歡迎使用,歡迎 Star :)

相關文章