【问题标题】:Maximum call stack size exceeded while uploading large file using dropbox nodejs api使用 dropbox nodejs api 上传大文件时超出最大调用堆栈大小
【发布时间】:2015-08-07 17:45:06
【问题描述】:

我在 ubuntu 上运行节点服务器。 我在 nodejs 中使用 Dropbox 模块。(https://www.npmjs.com/package/dropbox)

node -v = v0.10.38

npm -v = 1.4.28

我在前端使用 angularjs 来使用 (https://github.com/danialfarid/ng-file-upload) 库上传文件。 上传

(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.

这是我正在使用的相关代码:

var client = new Dropbox.Client({
    "key": "XXXXXXXXXXX",
    "secret": "XXXXXXXXXXXX",
    "token": "XXXXXXXXXXXXXXXXXXx",
    "uid": "XXXX"
});
    app.all('/test', function (req, res) {
        console.log(req.files); 
        var f = req.files.file;
        var dbx_file_stat;
        var short_url;
        var new_file_name = 'generate file name';
        fs.readFile(f.path, function (error, data) {
            if (error) {
                console.log('read error');
                return console.log(error);
            }
            client.writeFile(new_file_name, data, function (error, stat) {
                if (error) {
                    console.log('write error');
                    return console.log(error);
                }
                //stopReportingProgress();
                client.makeUrl(new_file_name, {downloadHack:true},function (error,url) {
                        if (error) {
                        return console.log(error);
                    }                                       
                    res.send("it works");                             
                });
            });
        });
    })

大文件正在上传到服务器,但无法上传到 Dropbox 服务器。 我做了一些研究。一些建议使用(https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg)。但如何实施。是什么导致了这个问题? 我还尝试通过node --stack-size=320000 app.js 运行应用程序 在这之后出现了新的错误,

(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
Segmentation fault

【问题讨论】:

  • 仅供参考(与您询问的问题无关),如果您的 3 个异步操作中的任何一个出现错误,您永远不会向浏览器发送响应。
  • @jfriend00 相同的代码适用于小文件。我做了更多测试,发现了导致问题的 client.writeFile 函数。我不明白。它是一个标准库。我需要自己处理递归吗?
  • 你显然没有理解我的评论。我是说您对三个异步操作的错误处理无法正常工作。这与您发布的主要问题无关 - 这是您应该解决的额外问题。

标签: node.js recursion dropbox dropbox-api stack-size


【解决方案1】:

我无法使用以下代码和 75MB 文件重现您的错误。也许这个问题与您的应用程序的其他部分有关。 (看起来您可能正在使用 Express?)

var fs = require('fs'),
    dropbox = require('dropbox');

var client = new dropbox.Client({ token: "REDACTED" });

fs.readFile('testfile', function (error, data) {
    client.writeFile('testfile', data, function (error, stat) {
        if (error) {
            console.log('ERROR: ' + error);
        } else {
            console.log(stat);
        }
    });
});

如果您仍然能够重现错误,请分享一个较小的重现。

【讨论】:

  • 您好,您能确认一下您的快递版本吗?我在“express”中测试了我的代码:“^5.0.0-alpha.1”
  • 我没有使用 Express。以上是我跑的全部代码。
  • 奇怪,我也试过了。它给了我同样的错误。我相信它的服务器配置问题。你能分享你的 ulimit -s 和 --stack-size 值吗?你用的是ubuntu机器吗?我使用 'htop' 检查了 ram 的使用情况。内存使用量不会超过服务器内存值。
  • 确认一下,您正在运行我上面的代码吗?我试过但无法找到您所在的旧版本节点。你试过最新版本吗?我的机器是 Macbook Pro,但我没有方便检查 ulimit 等。(我猜这只是 Yosemite 上的默认值。)
  • 是的,与 55Mb 文件完全相同的代码,我在窗口机器上尝试了与最新节点版本相同的代码,它可以工作。我避免在 ubuntu 上更新节点版本,因为其他服务器也在同一版本上运行。看来我必须更新版本。旧版本中可能存在错误。会及时通知您。
猜你喜欢
  • 1970-01-01
  • 2019-07-05
  • 2017-09-02
  • 2014-02-07
  • 2017-07-02
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多