造輪子系列 — 註解、外掛式node.js web / restful api 框架

澤陽發表於2019-01-19

polix是基於koa v2.5.0IOC、外掛式開發框架,和平常的Node.js Web Framework相比,它無需另外繫結路由集合、可擴充、開發簡單,依照java的著名依賴注入框架spring來製作,讓開發者專注於邏輯。polix採用多服務多程式架構來保證服務的穩定和快速響應能力。polix的中介軟體和koa v2.x的中介軟體保持相容。預設使用的ORMsequelize(後續會提供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

相關文章