使用TypeScript+Sharp实现图片缩放API时遇文件未找到问题求助
问题解决方法
你的推测完全正确——imgResize是异步操作,调用后立刻执行res.sendFile时,缩略图文件还没生成,所以首次访问会报文件不存在的错误;第二次访问时文件已经生成,因此正常。
以下是几种可行的解决方式:
1. 基于Promise/Async-Await处理异步逻辑
如果你的imgResize函数支持返回Promise(可自行改造为Promise形式),直接用await等待图片处理完成后再发送响应:
// 确保imgResize返回Promise await imgResize(imageLoc, name as string, width, height, newLocation); const thumbnailPath = `${newLocation}/${name}_${width}_${height}.png`; res.sendFile(thumbnailPath);
2. 改用回调函数完成后续操作
如果imgResize是传统回调式设计,修改函数添加回调参数,在图片处理完成后再执行响应发送:
// 改造imgResize,在处理完成时调用传入的回调 function imgResize(imageLoc, name, width, height, newLocation, callback) { // 原有缩放逻辑... // 处理完成后调用回调(出错则传入错误对象) callback(null); } // 调用时传入回调 imgResize(imageLoc, name as string, width, height, newLocation, (err) => { if (err) { return res.status(500).send('图片缩放处理失败'); } const thumbnailPath = `${newLocation}/${name}_${width}_${height}.png`; res.sendFile(thumbnailPath); });
3. 增加文件存在性检查
先判断目标缩略图是否存在,存在则直接发送,不存在再执行缩放并发送:
const fs = require('fs'); const thumbnailPath = `${newLocation}/${name}_${width}_${height}.png`; if (fs.existsSync(thumbnailPath)) { res.sendFile(thumbnailPath); } else { // 用Promise等待缩放完成 imgResize(imageLoc, name as string, width, height, newLocation) .then(() => res.sendFile(thumbnailPath)) .catch(err => res.status(500).send(`处理失败:${err.message}`)); }
注意:无论哪种方式,都要做好错误捕获,避免因图片处理失败导致请求挂起。
内容的提问来源于stack exchange,提问作者Ahmed_Mostafa
相关产品推荐
相关产品推荐

