造轮子系列 --- 注解、插件式node.js web / restful api 框架
polix
是基于koa v2.5.0
的IOC
、插件式开发框架,和平常的Node.js Web Framework
相比,它无需另外绑定路由集合、可拓展、开发简单,依照java
的著名依赖注入框架spring
来制作,让开发者专注于逻辑。polix
采用多服务多进程架构来保证服务的稳定和快速响应能力。polix
的中间件和koa v2.x
的中间件保持兼容。默认使用的ORM
是sequelize
(后续会提供polix-orm
)。开发者可以选择ES6/7/8 或者 TypeScript来进行开发。
$ npm i polix --save
Getting Started
使用polix-cli
初始化应用$ npm i polix-cli -g $ pol init example && cd example $ make build && make dev
Service
在service
文件夹下添加user.js
const { Service } = require('polix'); class UserService extends Service { constructor(){ super(); this._name = {}; } async addUser(userId,name){ this._name[userId] = name; return this; } async getUser(userId){ return this._name[userId]; } } module.exports = UserService;
Controller
在controller
文件夹下添加user.js
const { Controller, GET, POST, DEL, PUT } = require('polix'); class UserController extends Controller { // POST /user/addUser @POST async addUser(param, ctx){ await this.service.user.addUser(param.userId,param.name); ctx.body = { result: 'ok' }; } // GET /user/getUser @GET async getUser(param, ctx){ let user = await this.service.user.getUser(param.userId); ctx.body = { user }; } // GET /user/info @GET('info') async getInfo(param, ctx){ ctx.body = { v: 'v1.0' } } // PUT /user/updateUser @PUT async updateUser(param, ctx){ ctx.body = { status: true } } // DEL /user/delUser @DEL async delUser(param, ctx){ ctx.body = { status: true }; } // GET /user/status/:userId @GET('status/:userId') async getStatus(param, ctx){ ctx.body = { status: true, userId: param.userId }; } } module.exports = UserController;
Middware
polix
的中间件与koa 2.x 的中间件保持兼容
框架默认加载koa-body
中间件,如需另外添加中间件则新建middware
文件夹(与controller
文件夹平级)
添加跨域中间件 ,新建cors.js
:
# cors.js const cors = require('koa2-cors'); module.exports = function(){ return cors({ origin: function(ctx) { return '*'; }, exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'], maxAge: 5, credentials: true, allowMethods: ['GET', 'POST', 'DELETE'], allowHeaders: ['Content-Type', 'Authorization', 'Accept'] }); }
该文件夹下必须存在index.js
文件作为总输出中间件文件,加载时根据导出对象的顺序进行绑定中间件
# index.js const cors = require('./cors'); module.exports = { cors // 必须是函数 ,绑定方式为:app.use(cors()) }
Plugin
$ npm i --save polix-request在项目根目录下的
config
文件夹下的plugin.default.js
中添加以下代码// `curl`最终会挂载到`this.app`下 exports.curl = { // 表示是否启用该插件 enable: true, // 插件`npm`包名 package: 'polix-request' };在
controller
里用polix-request
@GET async getWebInfo(param, ctx){ let result = await this.app.curl.get('https://www.baidu.com'); ctx.body = { data: result } }
polix
已经内置polix-request
插件了,这里只是个演示Start
$ make dev
地址:polix.js