Запросы с результатом конвейера запроса-обещания (Большие данные)
Я пытаюсь загрузить некоторые данные из внешнего API. Я хотел бы направить ответ на каждый запрос. Массив, включающий URL-адреса запроса, выглядит следующим образом:
[ 'https://scihub.copernicus.eu/dhus/odata/v1/Products(\'d98b8730-846f-46d0-a816-5ae4db9f56a7\')/$value',
'https://scihub.copernicus.eu/dhus/odata/v1/Products(\'6edaeb16-3077-45d1-b3f0-fa2d5549f64a\')/$value',
'https://scihub.copernicus.eu/dhus/odata/v1/Products(\'333db2aa-c695-4753-8bd1-e64308af26e1\')/$value',
'https://scihub.copernicus.eu/dhus/odata/v1/Products(\'052cf771-6c4e-4a3a-bc15-51c95a3f37c4\')/$value' ]
Я прочитал это request-promise
не поддерживает передачу ответа на запрос, но я не нашел альтернативы, поэтому функция, с которой я пытаюсь получить результаты, выглядит следующим образом:
var fs = require('fs');
var rp = require('request-promise');
function downloadSentinel(promObj){
return new Promise((resolve,reject) => {
try {
var promises = promObj.requestURLS.map(url => rp(url,{auth:auth}).then(body => body.pipe(fs.createWriteStream('./test.zip'))
.on('finish', () => {
resolve(promObj);
})), {concurrency:2});
Promise.all(promises).then(results => {
console.log(results)
});
} catch (error) {
reject(error);
}
})
}
Кроме того, можно загрузить только два продукта одновременно, я пытался добиться этого с помощью параметра Blubird concurrency
, но это, кажется, не работает должным образом.
Как я мог решить мою проблему?
ОБНОВИТЬ
Если я попробую это с этим кодом:
var promises = promObj.requestURLS.map(url => rp(url,{auth:auth}).then(
data => new Promise((resolve,reject) => {
data.pipe(fs.createWriteStream('./data/' + promObj.Name[0] + ".zip"))
.on('finish', () => {
console.log('Finally finished');
resolve(promObj);
})
.on('error', () => {
reject(promObj);
})})),{concurrency:2});
Promise.all(promises).then(results => {
console.log(results)
});
Я получаю ошибку UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): ReferenceError: data.pipe is not a function
Что я пропустил?
Кроме того, я понял, что мои данные имеют размер 800 МБ. Это слишком большой, чтобы передать это без ошибки?
Я получаю эту ошибку сейчас: В buffer.js:556
if (encoding === undefined) return buf.utf8Slice(start, end);
Error: "toString()" failed