如何找到异步nodejs程序失败的源代码行
How to find the source line in which a async nodejs program fails
我的 nodejs 代码有一个错误,涉及使用 q 将文件并行上传到 AWS Bucket。代码中某处产生错误。我不知道在哪里。
具体情况:
我有一个简单的 nodejs 脚本,它将当前目录中的所有文件上传到 aws 存储桶和 return "q" 结果承诺:
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);
});
现在,当我执行此操作时,出现如下错误:
[TypeError: self.service.constructor.__super__ is not a function]
但是我不知道如何找到产生这个错误的源代码行。
我用
尝试了 运行 脚本
node debug script.js
但这并没有帮助。
如果您想找到实际产生错误的源代码行,您可能需要启用 Q 的长堆栈跟踪支持:
Q_DEBUG=1 node script.js
但我已经可以告诉你,问题是 bucket.upload
方法需要上下文 (this
) 是 bucket
。所以你需要将该方法绑定到 bucket
.
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 });
}));
}
我的 nodejs 代码有一个错误,涉及使用 q 将文件并行上传到 AWS Bucket。代码中某处产生错误。我不知道在哪里。
具体情况: 我有一个简单的 nodejs 脚本,它将当前目录中的所有文件上传到 aws 存储桶和 return "q" 结果承诺:
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);
});
现在,当我执行此操作时,出现如下错误:
[TypeError: self.service.constructor.__super__ is not a function]
但是我不知道如何找到产生这个错误的源代码行。
我用
尝试了 运行 脚本node debug script.js
但这并没有帮助。
如果您想找到实际产生错误的源代码行,您可能需要启用 Q 的长堆栈跟踪支持:
Q_DEBUG=1 node script.js
但我已经可以告诉你,问题是 bucket.upload
方法需要上下文 (this
) 是 bucket
。所以你需要将该方法绑定到 bucket
.
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 });
}));
}