keep going with us.
  • 1.合并analyse.js 和 auth.js代码
  • 2.增强权限匹配的模式
  • 3.添加系统异常捕捉绑定函数
  • 4.去除2个多余的函数
  • 5.新增2个钩子埋入点

1.合并analyse.js 和 auth.js代码

将2个中间件的代码合并到auth.js中,在auth中间件中验证key和root权限

2.增强权限匹配的模式

使用正则表达式来匹配接口权限

1
2
3
4
5
6
7
8
let method = postData.method
// 使用正则表达式来匹配信息
let root = '^' + approot + '$'
// 涵盖权限
if(new RegExp(root).test(method)){
await next()
return
}

如:

  • order.* 可授权order模块下的所有接口权限
  • app.* 可授权app模块下的所有接口权限
  • (order|app).* 可授权 order 和 app 两个模块下所有的接口
  • * 可授权所有权限

3.添加系统异常捕捉绑定函数

在 fpm 的核心api中添加 bindErrorHandler(handler) 绑定koa的系统错误回调。

1
2
3
bindErrorHandler(handler){
this.errorHandler = handler
}

4.去除2个多余的函数

删除了 use(middleware) , addRouter(routers, methods) 2个多余的函数。

5.新增2个钩子埋入点

添加了 FPM_MIDDLEWARE , FPM_ROUTER 2个钩子埋入点,可在插件开发中利用,可为fpm绑定更多的路由和中间件。

1
2
this.runAction('FPM_MIDDLEWARE', this, this.app)
this.runAction('FPM_ROUTER', this, this.app)

除了传入 fpm , 还会将koa的引用一起传入到插件的 bind() 函数中。

Read More
post @ 2017-03-01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 1.获取app,即koa对象
getApp()

// 2.添加业务模块,要求biz为 Biz 类型
addBizModules(biz)

// 3.注册系统级action钩子,传入可用的action钩子名和钩子代码
registerAction(actionName, action)

// 4.执行系统级钩子
runAction(actionName)

// 5.直接执行业务代码,业务函数名,参数,版本号
async execute(method, args, v)

// 6.添加业务函数的钩子,要求hook为 Hook 类型
addHook(hook)

// 7.获取config.json中的配置信息,或通过插件注入的配置信息
getConfig(c)

// 8.扩展config.json的配置信息,注意:此函数只会将信息暂存到内存中,重启之后会失效
extendConfig(c)

// 9.获取配置信息中的所有的客户端授权信息
getClients()

// 10.绑定系统错误函数
bindErrorHandler(handler)

// 11.启动服务
run()
Read More

0. 什么是yf-fpm-server

yf-fpm-server是一款轻量级的api服务端,可通过插件集成数据库(mysql,mongodb)的数据操作,灵活扩展自定义业务逻辑


BETA版更新概要

  • 1.更新依赖
  • 2.支持插件集成
  • 3.添加config.json静态配置文件
  • 4.文件改动
  • 5.示例代码

1. 更新依赖

为了让核心代码更轻便,去除了很多臃肿的依赖;除了Babel相关的以外,最终依赖如下一些模块:

1
2
3
4
5
6
7
8
9
{
"koa": "^2.0.0",
"koa-bodyparser": "^3.2.0",
"koa-router": "^7.1.0",
"koa2-cors": "^2.0.3",
"lodash": "^4.16.1",
"md5": "^2.1.0",
"moment": "^2.13.0"
}

2. 支持插件集成

在一些主要的操作节点上添加了钩子,可进行插件开发集成。

钩子列表如下:
  • INIT 服务初始化时
  • BEFORE_ROUTER_ADDED 路由添加之前
  • AFTER_ROUTER_ADDED 路由添加之后
  • BEFORE_MODULES_ADDED 业务模块添加之前
  • AFTER_MODULES_ADDED 业务模块添加之后
  • BEFORE_SERVER_START 服务启动之前
  • AFTER_SERVER_START 服务启动之后
默认实现的插件包括:

(点击可进入github)

Read More

为什么需要插件扩展?

  • 模块化思想

任何一个易用的系统都强调易用,易维护,模块化是nodejs的核心思想(显然并不是nodejs首先提出的);nodejs有很多优秀的package都支持插件式开发:hexo(非常流行的静态博客生成工具),egg(ali团队推出的企业级开发框架),etc…


当然模块化不仅仅限于使用插件化的方式;还有node web开发中非常常见的中间件模式。


总之,无论是oop、中间件、插件化这些设计模式都是为了更加解耦、更加抽象、更加易读、易用、易维护。

  • 扩展更加便捷

好的设计模式可以做到不需要对现有的系统代码做任何修改,对现有代码无侵入的情况下做到功能拓展。插件机制就是一种很常见的设计模式,可以用最小的成本满足大部分的应用场景。

  • 核心代码更纯粹

插件可以随时添加,任意添加,对已封装的核心代码没有任何改变,核心代码更加纯粹,保持最精简的状态,极大程度的避免了快速迭代过程中造成核心崩溃的情况。

如何实现插件扩展机制?

Read More

最近完成了一个ionic项目,服务端是用的websocket,之前还没应用过ws来做前后端的交互;经过这个项目的实践,将这段代码进行封装,并做简要的说明。

1.添加依赖[$websocket]

这个不多说,这个模块是ng1中使用websocket的不二之选,官方文档也很详细:传送门

官方实例是这么写的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
angular.module('YOUR_APP', [
'ngWebSocket' // you may also use 'angular-websocket' if you prefer
])
// WebSocket works as well
.factory('MyData', function($websocket) {
// Open a WebSocket connection
var dataStream = $websocket('ws://website.com/data');

var collection = [];

dataStream.onMessage(function(message) {
collection.push(JSON.parse(message.data));
});

var methods = {
collection: collection,
get: function() {
dataStream.send(JSON.stringify({ action: 'get' }));
}
};

return methods;
})
.controller('SomeController', function ($scope, MyData) {
$scope.MyData = MyData;
});

如果你的项目中没有复杂的交互,仅仅是在一个页面中存取数据,这样已经足够了。

但往往项目稍微复杂的应用都无法通过这个来满足。

以下是我个人的简单实现;也仅仅是一种思路的实现,仅供参考 :D

Read More
⬆︎TOP