节点服务工具
准备你的Node.js生产申请!
此库提供常见的功能, 如优雅的错误处理和关闭, 结构化的 JSON 记录和几个 HTTP 中间软件, 使您的应用程序真正为现代的容器化环境做好准备, 如 库伯涅斯。 。 。 .
安装
npm i @banzaicloud/service-tools
# or
yarn add @banzaicloud/service-tools
用法实例( E)
此库以TypeScript来写出,指被公布的类型或源代码用于参数和返回类型.
有实例可供查阅 快递 财务报告和审定财务报表 科亚 框架。 看看这个 实例 文件夹!
主要出口
catchErrors(options)
抓住未被发现的例外 和未处理的承诺拒绝。 之后恢复正常运行不安全 无法排除。 。 。 .
const { catchErrors } = require('@banzaicloud/service-tools')
// ...
// the handlers return a Promise
// the handlers are called in order
catchErrors([closeServer, closeDB])
// the error will be caught and the handlers will be called before exiting
throw new Error()
gracefulShutdown(handlers, options)
优雅关闭: 退出前释放资源( 数据库, HTTP 连接,...) 。 申请收到时 SIGTERM 或者说 SIGINT 信号,将调用近接器。 处理者应返回 a Promise。 。 。 .
const { gracefulShutdown } = require('@banzaicloud/service-tools')
// ...
// the handlers return a Promise
// the handlers are called in order
gracefulShutdown([closeServer, closeDB])
logger
A 类 皮诺 结构化 JSON 日志实例配置 config.pino。 。 。 .
const { logger } = require('@banzaicloud/service-tools')
logger.info({ metadata: true }, 'log message')
// > {"level":30,"time":<ts>,"msg":"log message","pid":0,"hostname":"local","metadata":true,"v":1}
使用已提供的日志而不是 console
全球覆盖 console 并使用库提供的日志打印信件.
const { logger } = require('@banzaicloud/service-tools')
console.log('log message')
// > log message
logger.interceptConsole()
console.log('log message')
// > {"level":30,"time":<ts>,"msg":"log message","pid":0,"hostname":"local","v":1}
配置
动态装入配置 .
config.environment
使用 NODE_ENV 环境变量,具有以下公认的价值:生产、开发、测试.
const { config } = require('@banzaicloud/service-tools')
// validates the NODE_ENV environment variable
console.log(config.environment)
// > { nodeEnv: 'production' }
config.pino
被提供方使用 日志使用 LOGGER_LEVEL 财务报告和审定财务报表 LOGGER_REDACT_FIELDS 环境变量。 这个 LOGGER_LEVEL 可以是以下之一:致命,错误,警告,信息,调试,追踪. LOGGER_REDACT_FIELDS 是一个逗号分隔的字段名称列表,以遮盖输出(默认为: 'password, pass, authorization, auth, cookie, _object') (中文(简体) ).
const pino = require('pino')
const { config } = require('@banzaicloud/service-tools')
const logger = pino(config.pino)
logger.info({ metadata: true, password: 'secret' }, 'log message')
// > {"level":30,"time":<ts>,"msg":"log message","pid":0,"hostname":"local","metadata":true,"password":"[REDACTED]","v":1}
中间软件( Koa)
数个中间软件 科亚 网络框架.
errorHandler(options)
Koa 错误处理器中间软件 .
const Koa = require('koa')
const { koa: middleware } = require('@banzaicloud/service-tools').middleware
const app = new Koa()
// this should be the first middleware
app.use(middleware.errorHandler())
healthCheck(checks, options)
科阿健康检查端点操作员.
const Koa = require('koa')
const Router = require('koa-router')
const { koa: middleware } = require('@banzaicloud/service-tools').middleware
// ...
const app = new Koa()
const router = new Router()
// the checks return a Promise
router.get('/health', middleware.healthCheck([checkDB]))
app.use(router.routes())
app.use(router.allowedMethods())
prometheusMetrics(options)
科亚 普罗米修斯 测量端点处理器。 默认它收集一些 默认参数。 。 。 .
const Koa = require('koa')
const Router = require('koa-router')
const { koa: middleware } = require('@banzaicloud/service-tools').middleware
// ...
const app = new Koa()
const router = new Router()
router.get('/metrics', middleware.prometheusMetrics())
app.use(router.routes())
app.use(router.allowedMethods())
requestValidator(options)
Koa 请求验证器中间软件 。 接受 乔 计划 body (身体解析器要求), params 财务报告和审定财务报表 query (需要排队). 以 400 如果请求无效。 指定验证值为 ctx.state.validated。 。 。 .
const joi = require('joi')
const qs = require('qs')
const Koa = require('koa')
const Router = require('koa-router')
const bodyParser = require('koa-bodyparser')
const { koa: middleware } = require('@banzaicloud/service-tools').middleware
// ...
const app = new Koa()
const router = new Router()
const paramsSchema = joi
.object({
id: joi
.string()
.hex()
.length(64)
.required(),
})
.required()
const bodySchema = joi.object({ name: joi.string().required() }).required()
const querySchema = joi.object({ include: joi.array().default([]) }).required()
router.get(
'/',
middleware.requestValidator({ params: paramsSchema, body: bodySchema, query: querySchema }),
async function routeHandler(ctx) {
const { params, body, query } = ctx.state.validated
// ...
}
)
app.use(bodyParser())
// query parser
app.use(async function parseQuery(ctx, next) {
ctx.query = qs.parse(ctx.querystring, options)
ctx.request.query = ctx.query
await next()
})
app.use(router.routes())
app.use(router.allowedMethods())
requestLogger(options)
Koa 请求日志中间软件 。 用于本地开发与调试.
const Koa = require('koa')
const { koa: middleware } = require('@banzaicloud/service-tools').middleware
// ...
const app = new Koa()
// this should be the second middleware after the error handler
// ...
app.use(middleware.requestLogger())
中间软件( Express)
数个中间软件 快递 网络框架.
errorHandler(options)
快捷错误处理器中间软件 .
const express = require('express')
const { express: middleware } = require('@banzaicloud/service-tools').middleware
const app = express()
// this should be the last middleware
app.use(middleware.errorHandler())
healthCheck(checks, options)
快递健康检查端点处理器.
const express = require('express')
const { express: middleware } = require('@banzaicloud/service-tools').middleware
// ...
const app = express()
// the checks return a Promise
app.get('/health', middleware.healthCheck([checkDB]))
prometheusMetrics(options)
快递 普罗米修斯 测量端点处理器。 默认它收集一些 默认参数。 。 。 .
const express = require('express')
const { express: middleware } = require('@banzaicloud/service-tools').middleware
// ...
const app = express()
app.get('/metrics', middleware.prometheusMetrics())
requestValidator(options)
Express 请求验证器中间软件. 接受 乔 计划 body (身体解析器要求), params 财务报告和审定财务报表 query返回时使用 400 如果请求无效。 指定验证值为 req。 。 。 .
const joi = require('joi')
const express = require('express')
const { express: middleware } = require('@banzaicloud/service-tools').middleware
// ...
const app = express()
const paramsSchema = joi
.object({
id: joi
.string()
.hex()
.length(64)
.required(),
})
.required()
const bodySchema = joi.object({ name: joi.string().required() }).required()
const querySchema = joi.object({ include: joi.array().default([]) }).required()
app.use(express.json())
app.get(
'/',
middleware.requestValidator({ params: paramsSchema, body: bodySchema, query: querySchema }),
function routeHandler(req, res) {
const { params, body, query } = req
// ...
}
)