如何查找异步nodejs程序失败的源代码行

时间:2016-05-02 15:07:39

标签: node.js error-handling q

我的nodejs代码中有一个错误,涉及使用q将文件并行上传到AWS Bucket。代码中的某处产生错误。我不知道在哪里。

具体情况: 我有一个简单的nodejs脚本,它将当前目录中的所有文件上传到aws存储桶并返回一个" 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

但这没有帮助。

1 个答案:

答案 0 :(得分:1)

如果要查找实际产生错误的源代码行,您可能需要启用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 });
    }));
}