You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何捕获Sharp抛出的错误?解决损坏文件致服务崩溃问题

解决Sharp处理损坏文件时未捕获错误导致服务器崩溃的问题

问题分析

你当前的代码存在两个核心问题:

  • Sharp的error事件回调里抛出的错误,不在try/catch的同步执行上下文里,无法被外层的try/catch捕获。
  • 返回的Promise仅监听了outStream的finish和error事件,未处理Sharp pipeline本身的错误,导致pipeline的错误变成未捕获异常,直接终止服务器进程。

修复后的代码

async makeWebpThumbnailForImageMedia(
  inStream: internal.Readable,
  outStream: internal.PassThrough
): Promise<internal.PassThrough> {
  return new Promise((resolve, reject) => {
    const pipeline = sharp()
      .resize(800)
      .webp({ effort: 3 })
      .pipe(outStream);

    // 捕获Sharp处理过程中的错误
    pipeline.on('error', (err) => {
      reject(new Error(`生成WebP缩略图失败: ${err.message}`));
    });

    // 捕获输入流读取错误
    inStream.on('error', (err) => {
      reject(new Error(`读取输入流失败: ${err.message}`));
    });

    // 监听输出流完成事件
    outStream.on('finish', () => {
      resolve(outStream);
    });

    // 捕获输出流写入错误
    outStream.on('error', (err) => {
      reject(new Error(`写入输出流失败: ${err.message}`));
    });

    inStream.pipe(pipeline);
  });
}

关键修改点

  • 统一错误处理到Promise的reject:不再在事件回调里抛出错误,直接调用reject让错误能被调用方的try/catch捕获。
  • 覆盖所有错误源:分别监听pipeline、inStream、outStream的error事件,确保所有环节的错误都能被捕获处理。
  • 移除无效的try/catch:原try/catch无法捕获异步事件回调里的错误,直接移除后改用Promise的reject统一处理。

使用示例

调用方法时用try/catch包裹即可捕获所有错误,避免服务器崩溃:

try {
  const resultStream = await makeWebpThumbnailForImageMedia(inputStream, outputStream);
  // 处理成功逻辑
} catch (err) {
  console.error(err.message);
  // 错误兜底处理,比如返回错误响应
}

内容的提问来源于stack exchange,提问作者Yokandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:54:55