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

使用memfs测试sharp时报错[Error: Input file is missing]如何解决?

问题根因

该报错是sharp和memfs的实现机制不兼容导致的:

  • memfs仅在Node.js的JavaScript运行时层面覆写了fs等文件操作模块,JS层调用的文件读写接口会被路由到内存中的模拟文件系统
  • sharp是基于C++开发的原生扩展,内部读取/写入文件时会直接调用操作系统内核的文件系统接口,完全感知不到Node.js层被替换的fs模块,因此会直接到真实磁盘上查找传入的路径,自然找不到存放在内存模拟卷中的文件。
解决方案

方案1:改用Buffer传递数据(推荐,无需修改测试的memfs逻辑)

不要给sharp传递文件路径,直接从memfs中读取图片的Buffer传给sharp处理,处理完成后再把输出的Buffer写回memfs即可,示例代码如下:

const sizeToCrop = {
  width: 378,
  height: 538,
  left: 422,
  top: 0,
};
// 从memfs中读取已下载的图片Buffer(这里的fs是被memfs覆写后的实例)
const imgBuffer = fs.readFileSync('./downloadedImage.jpg');

sharp(imgBuffer)
  .extract(sizeToCrop)
  .toBuffer() // 直接输出Buffer,不要调用toFile
  .then(croppedBuffer => {
    // 将裁剪后的Buffer写回memfs
    fs.writeFileSync('./CroppedImage.jpg', croppedBuffer);
    console.log('resolve!');
  })
  .catch((err: Error) => {
    console.log(err);
    return Promise.reject();
  });

这种方案全程不需要访问真实文件系统,完全兼容memfs的模拟逻辑,测试性能也更高。

方案2:测试时改用真实临时目录

如果业务逻辑必须使用路径调用sharp的toFile/文件路径入参,那么测试时这部分文件操作不要走memfs,改用操作系统的真实临时目录存放测试图片,测试完成后删除临时文件即可,可以用Node.js内置的os.tmpdir()生成临时路径,也可以用相关工具包简化临时文件管理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:48:03