如何捕获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
相关产品推荐
相关产品推荐

