API
Daruk
new Daruk(name: string, options: darukOptions)
Parameters:
name: string Daruk app实例名称
options: darukOptions 提供Daruk的目录名称
选项 | 默认值 | 描述 | 其他 |
---|---|---|---|
options.debug | false | 是否是 debug 模式 | - |
options.loggerOptions | 同 daruk-logger | logger配置 | https://github.com/daruk-framework/daruk-logger |
options.customLogger | null | 自定义 logger | 需要实现 daruk-logger 类似的接口 |
options.gracefulShutdown.enable | false | 是否开启优雅关机 | docker 已经根据 nginx 是否存在连接做了优雅关机,默认关闭 |
options.gracefulShutdown.timeout | 10*1000 | 关机超时 | - |
options.monitor.enable | false | 是否开启 v8 profiler 监控路由 | - |
options.monitor.v8AnalyticsPath | 'v8-analytics' | v8Analytic 安装路径 | - |
options.monitor.v8ProfilerPath | 'v8-profiler-node8' | v8Profiler 安装路径 | - |
options.monitor.auth.name | '' | 访问监控路由的用户名 | - |
options.monitor.auth.password | '' | 访问监控路由的密码 | - |
Daruk 实例包含下列方法:
#run(port:number|string, host?:string|Function, cb?:Function)
Desc: 启动 http 服务
Parameters:
port: string|number 端口号
host: string|Function 启动的 host 或者成功的回调
cb: Function 成功的回调
Example:
let daruk = require('daruk');
let app = daruk('myapp');
app.run(3030, '0.0.0.0', () => {
});
#serverReady(server: Http.server | Https.server)
Desc: 服务启动后需要调用的函数,以完成剩余操作。用于不调用 run 方法的自定义启动
Parameters:
server: Http.createServer(或 Https.createServer) 的返回值
Example:
// 调用 run 方法只能启动 http 服务
// https 服务需要自定义启动
// 类似于 koa 启动 https 服务
// https://github.com/koajs/koa/issues/960
import fs = require('fs');
import https = require('https');
import path = require('path');
import daruk from './daruk.init'
const options = {
key: fs.readFileSync(path.resolve(__dirname, './certificate/private.pem')),
cert: fs.readFileSync(path.resolve(__dirname, './certificate/ca.cer'))
}
const server = https.createServer(options, daruk.callback());
server.listen(3000, () => {
daruk.serverReady(server);
console.log(`server is starting at https://localhost:3000`)
});
#mockContext(req?: {})
Desc: 用于在非请求链路中得到一个模拟的 Context 对象
Parameters:
req: { [key: string]: any } 模拟的 request 对象
Return: Context
Example:
const ctx = darukInstance.mockContext()
ctx.service.userInfo.getUserList()
register
daruk 会按照约定的目录加载 middleware、controller、service 等,不过 daruk 也提供了编程式 api 接口,允许用户手动注册这些内容。这些 api 都采用统一形式的参数,以注册 middleware为例:
// src/middleware/index.ts
export default function (daruk) {
daruk.registerMiddleware({
// name 注册内容的 name,对应 daurk 自动 load 时的文件名或者文件夹名
name: 'koa-test-mid',
// export 导出的内容,对应 daurk 自动 load 时,模块导出的内容
export: async function (ctx, next) {
await next()
}
})
}
需要注意的是,手动注册模块时,只能在约定目录对应的 index.ts 中执行,比如上面注册 middleware 的操作必须在 src/middlewares/index.ts
执行,同样的注册其他模块的位置:
- src/middlewares/index.ts
- src/services/index.ts
- src/glues/index.ts
- src/utils/index.ts
- src/timers/index.ts
注意:由于 controller 的目录结构涉及到路由 path 的定义,因此暂不支持通过编程式接口定义。
具体api:
#registerMiddleware(describe | Array<describe>)
Desc: 注册中间件
Parameters:
describe:{
name: string 中间件名称
export: Function 中间件函数
}
#registerService(describe | Array<describe>)
Desc: 注册 service
Parameters:
describe:{
name: string service 名称
export: BaseService Daruk.BaseService 的子类
}
#registerUtil(describe | Array<describe>)
Desc: 注册 util
Parameters:
describe:{
name: string util 名称
export: any util 的内容
}
#registerTimer(describe | Array<describe>)
Desc: 注册Timer
Parameters:
describe:{
name: string 定时器名字
export: TimerConfig 定时器配置
TimerConfig: {
cronTime: string, // crontab 风格的配置
onTick: function 定时器触发的回调
onComplete: function 定时器完成的回调
}
}
logger
Desc: 日志输出
Example:
// daruk.logger 只是对 daruk-logger 实例的引用
// daruk-logger 文档:https://github.com/daruk-framework/daruk-logger
daruk.logger.warn('warn message') // 警告日志
daruk.logger.error({message: 'error message'}) // 错误日志,Object 会被 stringify
daruk.logger.info() // 普通日志
daruk.logger.debug() // debug日志
// 日志输格式
{"level":"warn","logType":"myapp","fileinfo":"/src/index.ts:283:25","msg":"message","os_hostname":"hahahh.local","timestamp":1538020260774}
exitHook
Desc: 进程退出的回调
Example:
// daruk.exitHook 只是对 daruk-exit-hook 实例的引用
// daruk-exit-hook 文档:https://github.com/daruk-framework/daruk-exit-hook
daruk.exitHook.addHook((err, cb) => {
if (err) {
daruk.logger.error(err.message)
}
daruk.logger.info('process exiting')
// 支持异步任务
setTimeout(() => {
daruk.logger.info('process exited')
cb()
}, 1000)
})