Restify 从 8.x 升级到 9.x 迁移指南

Restify 从 8.x 升级到 9.x 迁移指南

node-restify The future of Node.js REST development node-restify 项目地址: https://gitcode.com/gh_mirrors/no/node-restify

前言

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 有以下处理规则:

  1. 函数参数数量必须为 2(即只接受 req 和 res 参数)
  2. 必须是异步函数(AsyncFunction 实例)
  3. 当 Promise 成功解析时自动调用 next()
  4. 异步函数返回值将被忽略
  5. 当 Promise 被拒绝时:
    • 如果拒绝原因是 Error 实例,调用 next(err)
    • 其他情况将被包装为 AsyncError 后调用 next(err)
路由处理器规则

对于异步路由处理器:

  1. 函数参数数量必须为 2(req 和 res)
  2. 必须是异步函数
  3. 处理结果分多种情况:
    • 无返回值:调用 next()
    • 返回字符串:尝试重新路由(与 8.x 行为一致)
    • 返回其他值:调用 next(any)
  4. 错误处理与中间件相同
关于重新路由的说明

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 相比有几个关键区别:

  1. 性能优化:Pino 将绑定信息存储为单个序列化字符串,而 Bunyan 存储为对象键
  2. 日志级别设置:Pino 使用 setter 设置日志级别,Bunyan 使用方法
  3. 流处理:Pino 只接受一个流,如需多流支持需使用 pino-multistream
迁移建议

如果项目中原先依赖 Bunyan 的特定功能,升级后需要:

  1. 检查日志相关代码,确保使用 Pino 的 API
  2. 如需多流支持,引入 pino-multistream
  3. 更新日志配置方式

升级建议

  1. 先升级 Node.js:确保运行环境使用 Node.js 10+
  2. 逐步迁移
    • 先升级 Restify 版本
    • 然后逐步将回调函数改为 async/await 形式
  3. 测试覆盖
    • 特别注意错误处理逻辑
    • 验证重新路由行为
  4. 日志系统检查
    • 检查自定义日志配置
    • 必要时引入 pino-multistream

通过遵循本指南,开发者可以顺利将 Restify 应用从 8.x 升级到 9.x,充分利用新版本提供的现代化特性和性能改进。

node-restify The future of Node.js REST development node-restify 项目地址: https://gitcode.com/gh_mirrors/no/node-restify

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霍曙柏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值