2016-07-29 2 views
0

У меня есть same question as earlier, но у меня возникли проблемы с ответом на мой код. Вот моя ошибка: RangeError: Maximum call stack size exceeded.Превышен максимальный стек вызовов Node.js

Сильно упрощенная версия псевда мой код заключается в следующем:

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 в setImmediate или setTimeout среди нескольких других хаков, но ничего не кажется, чтобы предотвратить ошибку стеки вызовов. Я могу добавить любую библиотеку, которая сделает эту работу. Любые мысли были бы оценены.

+0

Здесь слишком много псевдо-кода, чтобы узнать, что происходит на самом деле. Нам нужно увидеть код REAL. Поскольку у вас есть код в вашем вопросе, он вряд ли что-то делает, потому что 'if (my_arr == '')' никогда не будет истинным, поэтому код делает несколько запросов БД и никогда ничего не делает с результатами. Пока ничего не видно. Я не думаю, что этот код создаст вашу ошибку. Там больше, чем вы здесь. – jfriend00

+0

Jfriend00 my_arr == '' будет правдой в 50% случаев. Это полезно? –

+0

Мой код очень длинный, но это в основном одна функция, включающая HTTP-запрос, который часто вызывает внутри себя. Разве нет обобщаемого решения? –

ответ

1

Если я правильно чтении кода, блок

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

переворачивает make_request быть нулевой функцией. Вы не хотите, чтобы звонил это именно этот пункт? Я думаю, что нулевое переопределение оставит вас с косвенной рекурсией, которая не сможет прекратить действие.

+0

Упс не означает, что там добавляется ключевое слово 'function'. См. Отредактированный код. –

1

Попробуйте изменить код

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); 
    });  
}); 

P.S. heinob в предложении на ваш вопрос сделать очень хороший ответ.

Смежные вопросы