я новичок в мире 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?
imageResizeToThumbnail
вы должны вызыватьreject
, когда естьerr
, вfetchImage
вы используете антишаблон конструктора промисов , а в обратном вызовеtest2.map
отсутствует операторreturn
. - person Bergi   schedule 29.07.2015request
. при передаче запросов вам нужно прослушивать событиеclose
, которое генерируется самим каналом. но он не работал даже после этого небольшого исправления. Итак, я попытался понизить версию узла с 0.12.x до 0.10.x, и теперь он работает безупречно! Любой, у кого есть такая же проблема с незаконченными трубами, должен подумать о понижении версии, прежде чем расстраиваться :) - person ChiefORZ   schedule 10.08.2015