使用nw.js,我只想将图像保存在具有不同随机名称的img元素数组中。
但是有一些错误,我的代码有问题吗?
Error: EMFILE: too many open files, open *<directory>*
imgs []是一个100-500 html img元素的数组,但我收到了
"Uncaught Error: socket hang up"
另一个错误:
Multimap
虽然它会保存一些图像,但其中一些图像已损坏,并且创建的图像数量实际上太多。
答案 0 :(得分:7)
使用graceful-fs
模块,它是fs
模块的替代品。它是本机fs
模块的包装器。引用docs of graceful-fs
module,
对
open
和readdir
次调用进行排队,如果有太多文件描述符出现EMFILE
错误,则会在某些内容关闭时重试这些调用。
由于它公开了与原生fs
模块相同的API,因此您可以像使用普通fs
模块一样使用它。
// use just like fs
var fs = require('graceful-fs');
注意:这个库是由Isaac Z. Schlueter创建的,他是Node.js的核心开发人员之一。
答案 1 :(得分:0)
另一个简单的解决方案是等待文件下载,然后使用递归打开新请求:
var fs = require('fs');
var request = require('request');
var dest = '../data/downloads/';
function _saveAllFiles (fileUrlArray, curIdx, options) {
try {
var count = fileUrlArray.length - 1;
var curFile = fileUrlArray[curIdx];
var stream = request(curFile)
.pipe(fs.createWriteStream(dest + "file_" + curIdx));
stream.on('finish', function () {
console.log("Downloaded", curFile);
stream.close();
if (curIdx + 1 < count) {
//Finished, download next file
_saveAllFiles(fileArray, curIdx + 1, options);
}
});
stream.on('error', function () {
console.log("Error", curFile);
stream.close();
stream.end();
if (curIdx + 1 < count) {
//Error occured, go to next file
_saveAllFiles(fileArray, curIdx + 1, options);
}
});
} catch (err) {
console.error("Failed to download file", err);
}
}