Restify 从 8.x 升级到 9.x 迁移指南
前言
Restify 9.x 版本带来了多项重要更新,包括对 async/await 的原生支持、默认日志系统切换为 Pino 等。本文将详细介绍从 8.x 升级到 9.x 需要注意的变更点和迁移策略,帮助开发者顺利完成版本过渡。
主要变更点
Node.js 版本要求变更
Restify 9.x 要求 Node.js 版本必须 >=10.0.0,不再支持 Node.js 8.x 版本。这是为了利用 Node.js 10+ 版本中更稳定的 async/await 支持和新特性。
异步处理支持
基本用法
9.x 版本原生支持在 .pre()
、.use()
和路由处理器中使用 async/await 语法:
const restify = require('restify');
const server = restify.createServer({});
// 中间件中使用 async/await
server.use(async (req, res) => {
req.something = await doSomethingAsync();
});
// 路由处理器中使用 async/await
server.get('/params', async (req, res) => {
const value = await asyncOperation(req.something);
res.send(value);
});
中间件处理规则
对于异步中间件函数,Restify 9.x 有以下处理规则:
- 函数参数数量必须为 2(即只接受 req 和 res 参数)
- 必须是异步函数(AsyncFunction 实例)
- 当 Promise 成功解析时自动调用 next()
- 异步函数返回值将被忽略
- 当 Promise 被拒绝时:
- 如果拒绝原因是 Error 实例,调用 next(err)
- 其他情况将被包装为 AsyncError 后调用 next(err)
路由处理器规则
对于异步路由处理器:
- 函数参数数量必须为 2(req 和 res)
- 必须是异步函数
- 处理结果分多种情况:
- 无返回值:调用 next()
- 返回字符串:尝试重新路由(与 8.x 行为一致)
- 返回其他值:调用 next(any)
- 错误处理与中间件相同
关于重新路由的说明
8.x 版本中,调用 next() 传入字符串会触发重新路由行为,9.x 保持了这一特性。当异步函数返回字符串时,也会尝试匹配对应路由。
关于错误处理的说明
虽然建议总是使用 Error 实例进行 reject,但 Restify 会对非 Error 的拒绝值自动包装为 AsyncError,确保错误处理流程的一致性。
处理器参数数量检查
Restify 9.x 对处理器函数的参数数量有严格检查:
- 参数 ≤ 2 的处理器必须是异步函数
- 参数 > 2 的处理器不应是异步函数
错误示例:
// 这个中间件会被拒绝,Restify 将抛出错误
server.use(async (req, res, next) => {
doSomethingAsync(function callback(val) {
req.something = val;
next();
});
});
RequestCaptureStream 移除
9.x 版本从核心代码中移除了 RequestCaptureStream 功能。如果需要类似功能,可以考虑使用社区替代方案或自行实现。
日志系统变更
从 Bunyan 切换到 Pino
9.x 版本使用 Pino 作为默认日志系统,移除了对 Bunyan 的依赖。Pino 是一个高性能日志库,与 Bunyan 相比有几个关键区别:
- 性能优化:Pino 将绑定信息存储为单个序列化字符串,而 Bunyan 存储为对象键
- 日志级别设置:Pino 使用 setter 设置日志级别,Bunyan 使用方法
- 流处理:Pino 只接受一个流,如需多流支持需使用 pino-multistream
迁移建议
如果项目中原先依赖 Bunyan 的特定功能,升级后需要:
- 检查日志相关代码,确保使用 Pino 的 API
- 如需多流支持,引入 pino-multistream
- 更新日志配置方式
升级建议
- 先升级 Node.js:确保运行环境使用 Node.js 10+
- 逐步迁移:
- 先升级 Restify 版本
- 然后逐步将回调函数改为 async/await 形式
- 测试覆盖:
- 特别注意错误处理逻辑
- 验证重新路由行为
- 日志系统检查:
- 检查自定义日志配置
- 必要时引入 pino-multistream
通过遵循本指南,开发者可以顺利将 Restify 应用从 8.x 升级到 9.x,充分利用新版本提供的现代化特性和性能改进。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考