Continuo a ricevere un errore ETIMEDOUT
o ECONNRESET
seguito da un errore Callback was already called
quando eseguo index.js
.Async.js - ETIMEDOUT e Callback erano già chiamati
In un primo momento ho pensato che fosse perché non ho incluso return
prima di chiamare il callback onEachLimitItem
. Quindi l'ho incluso per lo async multiple callbacks documentation. Ancora non risolvendolo. Ho anche provato a rimuovere l'evento di errore ea rimuovere il callback su onEachLimit nell'evento di errore, ma nessuno dei due ha funzionato. Ho esaminato le altre domande SO relative al problema di Callback already called
, ma poiché non riguardano i flussi, non ho trovato una soluzione.
La mia comprensione è che se lo stream incontra un errore come ECONNRESET
, restituirà la richiamata nell'evento di errore e passerà allo stream successivo, ma questo non sembra essere il caso. Sembra quasi che l'errore si risolva da solo, ovvero si riconnette e prova a inviare di nuovo il vapore errato ad Azure e funziona, quindi attiva l'evento "Fine" e otteniamo il Callback already called
.
Sto gestendo correttamente le callback negli eventi stream?
var Q = require('q');
var async = require('async');
var webshot = require('webshot');
var Readable = require('stream').Readable;
var azure = require('azure-storage');
var blob = azure.createBlobService('123', '112244');
var container = 'awesome';
var countries = [
'en-us', 'es-us', 'en-au', 'de-at', 'pt-br', 'en-ca', 'fr-ca', 'cs-cz', 'ar-ly', 'es-ve',
'da-dk', 'fi-fi', 'de-de', 'hu-hu', 'ko-kr', 'es-xl', 'en-my', 'nl-nl', 'en-nz', 'nb-no',
'nn-no', 'pl-pl', 'ro-ro', 'ru-ru', 'ca-es', 'es-es', 'eu-es', 'gl-es', 'en-gb', 'es-ar',
'nl-be', 'bg-bg', 'es-cl', 'zh-cn', 'es-co', 'es-cr', 'es-ec', 'et-ee', 'fr-fr', 'el-gr',
'zh-hk', 'en-in', 'id-id', 'en-ie', 'he-il', 'it-it', 'ja-jp', 'es-mx', 'es-pe', 'en-ph'
];
var uploadStreamToStorage = function (fileName, stream, onEachLimitItem) {
var readable = new Readable().wrap(stream);
var writeable = blob.createWriteStreamToBlockBlob(container, fileName);
readable.pipe(writeable);
writeable.on('error', function (error) {
return onEachLimitItem.call(error);
});
writeable.on('finish', function() {
onEachLimitItem.call(null);
});
};
var takeIndividualScreenshot = function (ID, country, onEachLimitItem) {
var fileName = ID + '-' + country + '.jpg';
var url = 'https://example.com/' + country + '/' + ID;
webshot(url, function (error, stream) {
if (error) { throw 'Screenshot not taken'; }
uploadStreamToStorage(fileName, stream, onEachLimitItem);
});
};
var getAllCountriesOfId = function (ID) {
var deferred = Q.defer();
var limit = 5;
function onEachCountry(country, onEachLimitItem) {
takeIndividualScreenshot(ID, country, onEachLimitItem);
}
async.eachLimit(countries, limit, onEachCountry, function (error) {
if (error) { deferred.reject(error); }
deferred.resolve();
});
return deferred.promise;
};
var createContainer = function() {
var df = Q.defer();
var self = this;
blob.createContainerIfNotExists(this.container, this.containerOptions, function (error) {
if (error) { df.reject(error); }
df.resolve(self.container);
});
return df.promise;
};
createContainer()
.then(function() {
return getAllCountriesOfId('211007');
})
.then(function() {
return getAllCountriesOfId('123456');
})
.fail(function (error) {
log.info(error);
});
Una cosa sto notando è che quando ho eseguito questo sul mio VM (3 GB di RAM) vs localmente (8 GB di RAM), è che lo script continua a gettare l'errore 'ECONNRESET' quando eseguilo sulla mia VM. – Blexy