node-beauty 是一个基于 Node.js restify 模块的 RESTful 服务器,你可以在以下地址找到该项目介绍及源代码,本页面仅为 自定义服务模块 提供开发指导。
NPM: https://www.npmjs.com/package/node-beauty
GITHUB: https://github.com/hdwong/node-beauty
$ npm install node-beauty
API
core – 核心类
Beauty 通过 core 类为服务模块提供常用的通用函数,并将个服务模块关联在一起(通过钩子函数),以解开模块间的业务耦合。
core.getRootPath – 获取根目录
string getRootPath ( void )
获取程序的根目录的绝对路径,即 app.js 启动程序所在目录。
core.getConfig – 获取配置信息
object getConfig ( string section )
获取服务模块的配置信息,该值来自配置文件的 service
部分。
core.getLogger – 获取日志类
Logger getLogger ( string section )
获取服务模块的日志类,若设置了 log4js
模块,则依赖该模块的配置文件并实现日志功能,否则 logger 只会输出到控制台。
logger 提供了 6 个日志登录(详细请参考 log4js)。
- trace
- debug
- info
- warn
- error
- fatal
core.getService – 获取服务类
object getService ( string service )
对于有依赖关系的类或者基础服务,Beauty 可以通过 getService
来获得类引用,如在模块中需要使用到 MySQL,那么可以:
1 2 |
// app.js server.use('db', require('node-beauty-mysql')); // 安装 MySQL 服务 |
1 2 3 |
// module.js var mysql = core.getService('db'); // 获取 MySQL 类引用 mysql.query('SELECT * FROM `test`, (result) => console.log(result)); |
core.serviceInvoke – 调用某服务的钩子
void serviceInvoke ( string service, string hook, mixed args, function callback )
对于无依赖关系的类,为了降低模块间的耦合度,Beauty 支持使用钩子调用的方式来实现模块间调用,钩子的定义格式查看 [module].hooks。
core.serviceInvokeAll – 调用所有服务的钩子
void serviceInvokeAll ( string hook, mixed args, function callback )
该方法会调用所有已安装模块中实现了 hook
钩子的方法。
core.serviceHook – 检查模块是否实现钩子
boolean serviceHook ( string service, string hook )
该方法判断某个服务模块是否已实现了某个钩子。
core.serviceImplements – 获取实现钩子的模块列表
array serviceImplements ( string hook )
该方法会获取已实现了某个钩子的服务模块列表。
core.randomString – 生成随机字符串
string randomString ( int len, string mode )
可通过 mode
来指定随机字符串的格式:
10
– 数字 [0-9]16
– 16 进制字符 [0-9a-f]c
– 大小写字母 [a-zA-Z]l
– 小写字母 [a-z]u
– 大写字母 [A-Z]ln
– 数字和小写字母 [0-9a-z]un
– 数字和大写字母 [0-9A-Z]
core.now – 获取时间戳
int now ( void )
获取当前 UNIX 时间戳。
core.forEach – 遍历集合
void forEach ( [object/array] collection, function row, function end )
该方法会遍历 collection
参数,该参数可以是对象或者数组(通过 lodash.forEach
方法实现)。
每一行记录会调用 row
函数,该函数接受当前值和一个 next
函数,用于执行下一行,当 collection
遍历完毕,end
函数会被调用。
1 2 3 4 5 6 7 8 9 10 11 |
core.forEach([ 'foo', 'bar', 'hello', 'world' ], (value, key, next) => { // 当不需要 key 时参数表可为 (value, next) console.log(key + ' => ' + value); next(); }, () => console.log('end')); /* 输出 0 => foo 1 => bar 2 => hello 3 => world end */ |
[module].init – 服务模块初始化
void init ( string serviceName, core core )
init ( string serviceName, core core, function next )
每个服务模块都会做一些初始化工作,需要实现 init
方法,Beauty 就会自动在加载模块时自动按顺序调用每个模块的 init。
若设置 next
回调函数,则告诉 Beauty 是异步的初始化(如 MySQL 或 Redis 的连接创建),需待异步回调后再显式执行 next
进入下一个模块的 init。
[module].uninit – 服务模块卸载
void uninit ( void )
若实现了该方法,Beauty 会在服务关闭时顺序调用每个 uninit。
[module].hooks – 钩子定义
array hooks ( void )
钩子定义格式:
[
‘钩子名称 1’: ‘钩子回调函数名称 1’,
‘钩子名称 2’: ‘钩子回调函数名称 2’,
…
]
钩子名称
和 钩子回调函数名称
都必须是字符串,且回调函数必须在类中被实现,否则钩子无效。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// user.js { ... hooks: () => { return { post: 'afterPost', // 发布帖子后,增加用户发帖数 reply: 'afterReply' // 回复帖子后,增加用户回帖数 }; }, afterPost: () => { // do something }, afterReply: () => { // do something }, ... } |
服务接口方法实现
服务接口的调用 url 格式为:/[服务模块名称]/[接口方法名称|'default']
Beauty 会根据请求的方法 req.method
自动查找对应的方法,找不到则返回 404,目前只支持:
- get – 获取
- post – 创建
- put – 更新
- delete – 删除
void [get/post/put/delete]_methodName ( request req, response res, function next )
如 GET: /foo/bar
,则 Beauty 会查找 foo
服务模块是否安装,且模块内是否已实现 get_bar
方法。
1 2 3 4 5 6 7 8 9 |
// foo.js { ... get_bar: (req, res, next) => { // do something next('foo bar'); }, ... } |
req
和 res
来源于 restify 模块,分别为请求对象和响应对象,next
函数为结束方法,必须显式调用以把响应控制交还 Beauty,否则会造成客户端无响应。
基础服务模块
为方便基础服务的快速复用,Beauty 提供了一些常用的基础服务模块,每个模块可能都有各自的配置项,详细请查看相应的 API 文档,加载方法:
1 2 3 4 5 |
// app.js /* * 加载 node-beauty-mysql, "db" 是模块别名,用于 core 的服务类获取(如 getService, getConfig)及钩子调用 */ server.use('db', require('node-beauty-mysql')); |