使用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
相关产品推荐
相关产品推荐

