服务器
fastify.server
:由 Fastify 的工厂函数
生成的 Node 原生 server 对象。
after
当前插件及在其中注册的所有插件加载完毕后调用。总在 fastify.ready
之前执行。
fastify
.register((instance, opts, next) => {
console.log('当前插件')
next()
})
.after(err => {
console.log('当前插件之后')
})
.register((instance, opts, next) => {
console.log('下一个插件')
next()
})
.ready(err => {
console.log('万事俱备')
})
ready
当所有插件的加载都完成时调用。如有错误发生,它会传递一个 error
参数。
fastify.ready(err => {
if (err) throw err
})
调用时不加参数,它会返回一个 Promise
对象:
fastify.ready().then(() => {
console.log('successfully booted!')
}, (err) => {
console.log('an error happened', err)
})
listen
所有的插件加载完毕、ready
事件触发后,在指定的端口启动服务器。它的回调函数与 Node 原生方法的回调相同。默认情况下,服务器监听 localhost
所决定的地址 (127.0.0.1
或 ::1
,取决于操作系统)。将地址设置为 0.0.0.0
可监听所有的 IPV4 地址。设置为 ::
则可监听所有的 IPV6 地址,在某些系统中,这么做亦可同时监听所有 IPV4 地址。监听所有的接口要格外谨慎,因为这种方式存在着固有的安全风险。
fastify.listen(3000, (err, address) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
})
指定监听的地址:
fastify.listen(3000, '127.0.0.1', (err, address) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
})
指定积压队列 (backlog queue size) 的大小:
fastify.listen(3000, '127.0.0.1', 511, (err, address) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
})
没有提供回调函数时,它会返回一个 Promise 对象:
fastify.listen(3000)
.then((address) => console.log(`server listening on ${address}`))
.catch(err => {
console.log('Error starting server:', err)
process.exit(1)
})
你还可以在使用 Promise 的同时指定地址:
fastify.listen(3000, '127.0.0.1')
.then((address) => console.log(`server listening on ${address}`))
.catch(err => {
console.log('Error starting server:', err)
process.exit(1)
})
当部署在 Docker 或其它容器上时,明智的做法是监听 0.0.0.0
。因为默认情况下,这些容器并未将映射的端口暴露在 127.0.0.1
:
fastify.listen(3000, '0.0.0.0', (err, address) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
})
route
将路由添加到服务器的方法,支持简写。请看这里。
close
fastify.close(callback)
:调用这个函数来关闭服务器实例,并触发 'onClose'
钩子。
服务器会向所有新的请求发送 503
错误,并销毁它们。
decorate*
向 Fastify 实例、响应或请求添加装饰器函数。参阅这里了解更多。
register
Fastify 允许用户通过插件扩展功能。插件可以是一组路由、装饰器或其他。请看这里。
use
向 Fastify 添加中间件,请看这里。
addHook
向 Fastify 添加特定的生命周期钩子函数,请看这里。
basepath
添加在路由前的完整路径。
示例:
fastify.register(function (instance, opts, next) {
instance.get('/foo', function (request, reply) {
// 输出:"basePath: /v1"
request.log.info('basePath: %s', instance.basePath)
reply.send({basePath: instance.basePath})
})
instance.register(function (instance, opts, next) {
instance.get('/bar', function (request, reply) {
// 输出:"basePath: /v1/v2"
request.log.info('basePath: %s', instance.basePath)
reply.send({basePath: instance.basePath})
})
next()
}, { prefix: '/v2' })
next()
}, { prefix: '/v1' })
log
日志的实例,详见这里。
inject
伪造 http 注入 (作为测试之用) 。请看更多内容。
addSchema
fastify.addSchema(schemaObj)
,向 Fastify 实例添加可共用的 schema,用于验证数据。你可以通过该 schema 的 id 在应用的任意位置使用它。
请看验证和序列化一文中的范例。
setSchemaCompiler
为所有的路由设置 schema 编译器 (schema compiler),请看这里了解更多信息。
setNotFoundHandler
fastify.setNotFoundHandler(handler(request, reply))
:为 404 状态 (not found) 设置处理器 (handler) 函数。向 fastify.register()
传递不同的 prefix
选项,就可以为不同的插件设置不同的处理器。这些处理器被视为常规的路由处理器,因此它们的请求会经历一个完整的 Fastify 生命周期。
你也可以为 404 处理器注册一个 beforeHandler 钩子。
fastify.setNotFoundHandler({
beforeHandler: (req, reply, next) => {
req.body.beforeHandler = true
next()
}
}, function (request, reply) {
// 设置了 beforeHandler 钩子的默认 not found 处理器
})
fastify.register(function (instance, options, next) {
instance.setNotFoundHandler(function (request, reply) {
// '/v1' 开头的 URL 的 not found 处理器,
// 未设置 beforeHandler 钩子
})
next()
}, { prefix: '/v1' })
setErrorHandler
fastify.setErrorHandler(handler(error, request, reply))
:设置任意时刻的错误处理器函数。错误处理器是完全封装 (fully encapsulated) 的,因此不同插件的处理器可以不同。支持 async-await 语法。
fastify.setErrorHandler(function (error, request, reply) {
// 发送错误响应
})
printRoutes
fastify.printRoutes()
:打印路由的基数树 (radix tree),可作调试之用。
记得在 ready
函数的内部或之后调用它。
fastify.get('/test', () => {})
fastify.get('/test/hello', () => {})
fastify.get('/hello/world', () => {})
fastify.ready(() => {
console.log(fastify.printRoutes())
// └── /
// ├── test (GET)
// │ └── /hello (GET)
// └── hello/world (GET)
})