2014-10-08 121 views
0

我在ubuntu 14.04.1上使用node.js v0.10.32,尝试并使用aws-sdk(2.0.18)上传(并下载)一个来自S3的文件。但上传大文件时出现以下错误,例如32MB。Node.js AWS S3 [RangeError:超出最大调用堆栈大小]

(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral. 
... 
(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral. 
RangeError: Maximum call stack size exceeded 

我试图使堆栈大小更大node --stack-size=16384 ...但没有运气。 这是我上传的源代码:

if (process.argv.length < 7) { 
    console.log ("usage: " + process.argv [0] + " " + process.argv[1] + " <config> <region> <bucket> <key> <file>") 
    return -1 
} 

var config = process.argv[2] 
var region = process.argv[3] 
var bucketName = process.argv[4] 
var key = process.argv[5] 
var file = process.argv[6] 

var fs = require ('fs') 
var aws = require ('aws-sdk') 
fs.readFile (config, "utf8", function (err, configFile) { 
    if (err) { 
     console.log ("Config file cannot be read: ", err) 
     return -1 
    } 
    aws.config = JSON.parse (configFile) 
    aws.config.region = region 

    var bucket = new aws.S3 ({params: {Bucket: bucketName}}) 

    fs.readFile (file, function (err, fileData) { 
     if (err) { 
      console.log ("Cannot open file for uploading: ", err); 
     } else { 
      bucket.createBucket (function() { 
       var data = {Key: key, Body: fileData} 
       bucket.putObject (data, function (err, data) { 
        if (err) { 
         console.log ("Error uploading data: ", err); 
        } else { 
         console.log ("Successfully uploaded!"); 
        } 
       }) 
      }) 
     } 
    }) 
}) 

我不知道,现在,请大家帮忙。 也许aws的分段上传是上传大文件的解决方案?

+0

您可能会在[此问题]上发表您的意见(https://github.com/aws/aws-sdk-js/issues/158)。另外,为了上传文件,你可以尝试类似['s3-upload-stream'](https://github.com/nathanpeck/s3-upload-stream),这样你就不必将整个文件加载到内存上传它。 – mscdex 2014-10-08 11:32:21

回答

0

虽然我找不到为什么堆栈大小超过最大值,但我发现它的原因。

问题是S3不快,网络不稳定使情况更糟。 这与this question有关。

解决此问题的一种方法是利用分段上传与重试机制(sample code,可在1中找到)。

相关问题