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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:05:43