详解IWinter 一个路由转控制器的 Nodejs 库


Posted in NodeJs onNovember 15, 2017

IWinter 是一个路由转控制器的 node 库,只解决一个问题:为了让使用者以更优雅的姿势进行路由的编写。支持在 Express 和 Koa 中使用。

项目地址:https://github.com/yvanwangl/iwinter

简介:

最近在学习使用 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:

  1. Nodejs 用户
  2. Typescript 用户
  3. 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();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs之请求路由概述
Jul 05 NodeJs
nodejs中实现路由功能
Dec 29 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
nodejs中的异步编程知识点详解
Jan 17 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 #NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 #NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 #NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 #NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 #NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 #NodeJs
详解使用PM2管理nodejs进程
Oct 24 #NodeJs
You might like
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
python如何实现int函数的方法示例
2018/02/19 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
迎新晚会策划方案
2014/06/13 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
出租车拒载检讨书
2015/01/28 职场文书
教师读书活动心得体会
2016/01/14 职场文书
初中语文教学反思范文
2016/03/03 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
tree shaking对打包体积优化及作用
2022/07/07 Java/Android