2016-05-02 10 views
0

Ich habe einen Fehler in meinem Nodejs-Code, der das Hochladen von Dateien parallel zu einem AWS-Bucket unter Verwendung von q umfasst. Irgendwo im Code wird ein Fehler erzeugt. Ich habe keine Ahnung wo.So finden Sie die Quellzeile, in der ein asynchrones Nodejs-Programm fehlschlägt

Die konkrete Situation: ich ein einfaches NodeJS Skript, das alle Dateien im aktuellen Verzeichnis zu einem aws Eimer uploads und gebe ein „q“ Versprechen des Ergebnisses:

var uploadAll = function() { 
    var uploadFiles = readdirRecursiveSync("."); 

    var uploadPromises = uploadFiles.map(function(fileName) { 
     var bucket = new AWS.S3({ params: { Bucket: bucketName } }); 
     var file = fs.createReadStream(fileName); 
     return Q.denodeify(bucket.upload)({ Body: file, Key: fileName}); 
    }); 
    return Q.all(uploadPromises); 
} 

uploadAll().then(function(){ 
    console.log("done"); 
}).catch(function(error) { 
    console.log(error); 
}); 

Nun, wenn ich mache das ich eine Fehlermeldung erhalten, die wie folgt lautet:

[TypeError: self.service.constructor.__super__ is not a function] 

Aber ich habe keine Ahnung, wie die Source-Leitung zu finden, die diesen Fehler erzeugt.

Ich habe versucht, das Skript mit

node debug script.js 

laufen Aber das half nicht.

Antwort

1

Sie werden wahrscheinlich brauchen Q langen Stack-Trace-Unterstützung zu aktivieren, wenn Sie die Source-Leitung finden wollen, die tatsächlich den Fehler produziert:

Q_DEBUG=1 node script.js 

Aber ich kann Ihnen jetzt schon sagen, dass das Problem ist, dass die bucket.upload Verfahren erfordert, dass der Kontext (this) bucket ist. Sie müssen diese Methode also an bucket binden.

var uploadAll = function() { 
    var bucket = new AWS.S3({ params: { Bucket: bucketName } }); 
    var bucketUpload = Q.nbind(bucket.upload, bucket); 
    return Q.all(readdirRecursiveSync(".").map(function(fileName) { 
     var file = fs.createReadStream(fileName); 
     return bucketUpload({ Body: file, Key: fileName }); 
    })); 
}