【问题标题】:Node.js maximum call stack exceeded超出 Node.js 最大调用堆栈
【发布时间】:2016-12-04 18:01:22
【问题描述】:

我有same question as earlier,但无法将答案与我的代码联系起来。这是我的错误:RangeError: Maximum call stack size exceeded

我的代码高度简化的伪版本是这样的:

function make_request(url, other_params){ 

  request(url, function(response){

    if(something) var some_var = 'some value';
    else var some_var = '';

    //do something with response to generate, some_var, and insert into DB

    var my_arr = [some_var];

    connection.query('INSERT my_table SET name = ?', my_arr, function(err, rows, fields) {
         if(my_arr==''){
               // generate new url to make new request
               make_request(url, other_params);
         }
    });

  });
}

connection.query('SELECT * from my_table', function(err, rows, fields){

  var len =rows.length;

  for(var i = 0; i < len; i++){

    var url = rows[i].url;

    make_request(url, other_params);

  }     
});

我尝试将内部make_request 包装在setImmediatesetTimeout 中以及其他一些技巧中,但似乎没有什么可以阻止调用堆栈错误。我可以添加任何可以完成这项工作的库。任何想法将不胜感激。

【问题讨论】:

  • 这里的伪代码太多了,看不出到底发生了什么。我们需要查看真实代码。由于您的问题中有代码,它几乎没有任何作用,因为if(my_arr=='') 永远不会为真,因此代码会进行一些数据库查询,并且从不对结果做任何事情。到目前为止,这里没有什么可看的。我不认为这段代码会产生你的错误。它比您在此处显示的要多。
  • Jfriend00 my_arr=='' 将在 50% 的情况下为真。这有帮助吗?
  • 我的代码很长,但它基本上是一个涉及 http 请求的函数,它经常在内部被调用。没有通用的解决方案吗?
  • 我们无法猜测问题出在哪里。我们必须查看导致问题的实际代码。据我所知,导致代码的问题不在您的问题中。删除您的问题或显示更多真实代码,以便我们真正为您提供帮助。要求我们进行疯狂的猜测并谈论他们,您不太可能得到很多人的帮助。
  • 您可以从异步响应中递归调用,而不必担心堆栈溢出。如果你从同步代码中递归调用,那么如果你做的太多,就会有堆栈溢出的风险。在这两种情况下,您都必须适当地处理所有错误(以避免无限循环或堆栈溢出),并确保您完全了解递归如何在所有情况下正确终止。关于您的具体问题的进一步建议需要查看导致问题的代码。

标签: javascript node.js recursion node-mysql node-request


【解决方案1】:

如果我正确阅读代码,则该块

     if(my_arr==''){
           // generate new url to make new request
           function make_request(url, other_params);
     }

ma​​ke_request 重新定义为空函数。难道你不想称之为这一点,而不是?我认为空值重定义会给您带来无法终止的间接递归。

【讨论】:

  • 哎呀不是要在那里添加'function'关键字。查看编辑后的代码。
【解决方案2】:

尝试更改您的代码

function make_request(url, other_params, callback){ // all async function mast have callback 
    // Hmmm...
    // request(url, function(response){ 
    request(url, function(err, response){  // according by doc - https://github.com/request/request
        // Use short notation
        var some_var = (smth) ? 'some-value' : '';

        // do-smth. Mayby problem is here?

        var my_arr = [some_var];
        connection.query('INSERT my_table SET name = ?', my_arr, function(err, rows, fields) {
            // Always check error
            if(err)
                return callback(err);

            // I don't understand what is it. If some_var == '' then my_arr == [], not ''
            // In any case this check must do on upper level
            /*
            if(my_arr=='')
                make_request(url, other_params);
            */
            callback(null, rows); // return data    
        });
    });
}


var async = require('async');

connection.query('SELECT url from my_table', function(err, rows, fields){ // if you need one field then don't request all
    // I repeat: Always check error. SQL can be correct, but db is busy.
    if (err)
        return console.log(err.message); 

    async.mapSeries(rows, make_request, function(err, results) {
        if (err)
            return console.log(err);

        // do smth with results 
        console.log(results);   
    });      
});

附: heinob 在您的问题前面给出了很好的答案。

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2014-12-03
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多