Максимальное количество параллельных каналов к fs

я новичок в мире node.js, но я хотел попробовать.

Я пытаюсь настроить сервер с Express, который предоставляет общедоступный API.

мой код в значительной степени настроен, но у меня возникла проблема, и я не знаю, почему это происходит.

вот что он делает:

  • проверьте, находится ли переданный URL-адрес в сети.
  • если целью является изображение, загрузите его локально
  • после завершения загрузки сделайте миниатюру из источника

.

function requestPromise(url, path) {
    return new Promise(function(fulfill, reject) {
        request(url, function(err, httpResponse, body) {
            if(err) {
                reject(err);
            } else {
                fulfill(path);
            }
        }).pipe(
            fs.createWriteStream(path)
        );
    });
}

function imageResizeToThumbnail(path) {
    return new Promise(function(fulfill, reject) {
        gm(path)
        .resize(300, 300, ">")
        .write(path, function(err) {
            if (err) return reject(err);
            fulfill(path);
        });
    });
}

function fetchImage(url) {
    return new Promise(function(fulfill, reject) {
        // creates a filesystem friendly string
        var path = './download/' + sanitize(url, {replacement: '_'});

        requestPromise(url, path).then(function(path) {
            return imageResizeToThumbnail(path);
        }).then(function(path) {
            fulfill(path);
        }).catch(function(err) {
            reject(err);
        });
    });
}

следующий тест работает отлично, изображение загружается, а после загрузки уменьшается в размере

var test1 = 'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png';

fetchImage(test1).then(function(response) {
    console.log(response, ' worked!');
});

затем я попробовал сразу несколько изображений, никаких проблем

var test2 = [
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png',
    'https://s.ytimg.com/yts/img/favicon_144-vflWmzoXw.png'
]

Promise.all(test2.map(function(item) {
    return fetchImage(item).then(function(response) {
        console.log(response, ' worked!');
    });
})).then(function(result) {
    console.log('all Promises done!');
}).catch(function(err) {
    console.log('error: ', err)
});

затем я взял тот же пример, что и выше, и запустил его с 1 000 элементов!

результат: imageResizeToThumbnail выдавало ошибку, так как изображение еще не скачалось... файл был создан, но не завершен (размер файла был 0 байт)

поэтому мой вопрос... существует ли ограничение на количество файловых потоков, которые могут быть созданы или переданы в fs?


person ChiefORZ    schedule 29.07.2015    source источник
comment
Всегда существуют ограничения операционной системы на дескрипторы файлов, но в вашем случае, похоже, возникает проблема параллелизма, которая появляется только при большой нагрузке. Существует старый вопрос, который может дать подсказку.   -  person Kenney    schedule 29.07.2015
comment
@Кенни: вот и все! Вы должны были опубликовать это как ответ (если хотите, я могу снова открыть вопрос)   -  person Bergi    schedule 29.07.2015
comment
Все в порядке, рад, что смог помочь!   -  person Kenney    schedule 29.07.2015
comment
Некоторые другие моменты, касающиеся использования промисов: в imageResizeToThumbnail вы должны вызывать reject, когда есть err, в fetchImage вы используете антишаблон конструктора промисов , а в обратном вызове test2.map отсутствует оператор return.   -  person Bergi    schedule 29.07.2015
comment
после большой головной боли я получил его на работу! во-первых, я сделал плохой request. при передаче запросов вам нужно прослушивать событие close, которое генерируется самим каналом. но он не работал даже после этого небольшого исправления. Итак, я попытался понизить версию узла с 0.12.x до 0.10.x, и теперь он работает безупречно! Любой, у кого есть такая же проблема с незаконченными трубами, должен подумать о понижении версии, прежде чем расстраиваться :)   -  person ChiefORZ    schedule 10.08.2015