Polix
Node.js Web Framework
polix
是基于koa v2.5.0
的装饰器、插件式开发框架,和平常的Node.js Web Framework
相比,它无需另外绑定路由集合、可拓展、开发简单,依照java
的著名依赖注入框架spring
来制作,让开发者专注于逻辑。polix
采用多服务多进程架构来保证服务的稳定和快速响应能力。polix
的中间件和koa v2.x
的中间件保持兼容。polix
提供Dockerfile
+docker-compose.yml
方案进行部署,默认使用的ORM
是sequelize
(后续会提供polix-orm
)。开发者可以选择ES6/7/8 或者 TypeScript来进行开发。
以上部分功能尚在开发阶段,敬请关注!
Install
$ 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){
const {body} = param;
await this.service.user.addUser(body.userId, body.name);
ctx.body = {
result: 'ok'
};
}
// GET /user/getUser
@GET
async getUser(param, ctx){
const {query} = param;
let user = await this.service.user.getUser(query.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){
const {router} = param;
ctx.body = {
status: true,
userId: router.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
插件了,这里只是个演示
Entity
数据库模型实体,以typeorm为例。
在根目录下创建entity
文件夹,在文件夹下面创建user.js
文件:
import {
Entity, Column, BaseEntity,
PrimaryGeneratedColumn
} from 'typeorm';
@Entity()
class User extends BaseEntity {
@PrimaryGeneratedColumn()
id = undefined;
@Column('varchar')
name = '';
}
module.exports = User;
common/orm.js
配置连接:
'use strict';
const typeorm = require('typeorm');
(async () => {
console.log('create connection');
await typeorm.createConnection();
})();
在启动入口文件引入:
require('./common/orm');
使用:
// server/user.js
async users() {
const {user} = this.app.entity;
return user.find();
}
Start
$ make build && make dev
Author
Polix © Ricky 泽阳, Released under the MIT License.