2015-11-12 5 views
-2

У меня есть следующий сценарий в Node.js:Почему скрипт node.js никогда не заканчивается?

var db = require("redis"); 
var dbclient = db.createClient(); 
function doSomeUpload() 
     dbclient.zrangs("noper", 0, 5000, function (err, replies){ 
      var lengthNum = replies.length; 
      for (var i=0; i < replies.length; i++){ 
       // Upload the file with s3 client 
       uploader.on('end', function(); 
       lengthNum--; 
       if (lengthNum == 0){ 
        console.log("Done!") 
        return; 
       } 
      })  
}) 
doSomeUpload() 

Когда я запускаю этот скрипт: node scriptupload.js, Done! печатается, но сценарий нескончаемой. Он все еще запущен, и я должен сделать ctrl+c, чтобы закончить процесс node.js.

Почему не она не заканчивается (даже когда функция возвращает ..)

+1

Что у людей с понижением? Предоставьте комментарии или не уменьшайте их. Это особенно плохое поведение с новыми членами сообщества. –

+0

Существуют такие переменные, как ** uploader **, которые не объявлены в предоставленном коде, и неясно, какие библиотеки используются. Наличие SSCCE очень помогло бы. Можете ли вы предоставить SSCCE? http://sscce.org/ –

+0

Я понимаю, что вы не можете включить ключ доступа AWS или секретный ключ доступа AWS. Просто поставьте пустые строки для тех, если вы не позволяете SDK узла SDS по умолчанию загружать их из ** ~/.aws/credentials ** –

ответ

0

Я бы поставил console.log("Returned"); в конце вашего скрипта. Он должен быть вызван, но, возможно, одна из загрузок S3 висит.

Помимо этого у вас есть синтаксические ошибки:

  1. в строке 3 (отсутствует открытая скобка { и соответствующая закрывающая скобка имеет закрытие на скобка ), что он не должен)
  2. на линии 9 (точка с запятой ; вместо открытой скобкой { и закрывающей скобки следующим)
  3. цикл не хватает закрывающей скобки
  4. : вызов dbclient.zrangs отсутствует точка с запятой ; после
  5. объявление для downloader.on отсутствует точка с запятой ; (возможно, это не обязательно, но усложняет ситуацию, а большинство сторонников стиля Node.js используют их)
  6. Отсутствует точка с запятой ; после вызова doSomeUpload()

Существует семантическая ошибка или ненужный код:

  1. возвращение внутри пользователя.на() обратного вызова будет возвращаться из этого обратного вызова не нарушают цикл или возвращения из doSomeUpload()

Вот исправленный код с некоторыми simplications, называя улучшения и обработки ошибок:

var db = require("redis"); 
var dbclient = db.createClient(); 
function doSomeUpload(){ 
    dbclient.zrangs("noper", 0, 5000, function(err, replies){ 
     if (err){ 
      console.error(err); 
     } else { 
      var uploadsRemaining = replies.length; 
      replies.forEach(function(reply){ 
       // Upload the file with s3 client 
       uploader.on('end', function() { 
        uploadsRemaining--; 
        if (uploadsRemaining == 0){ 
         console.log("Done!"); 
        } 
       }); 
      }); 
     } 
    }); 
} 
doSomeUpload(); 

Я думаю, что ошибка находится в коде, который не используется. Загрузка S3 может блокироваться, и это легко проверить, установив низкий тайм-аут, например, 10 секунд.

Это очень полезно использовать JSLint или редактор, который строит его или нечто подобное в (Emacs и WebStorm как делать): http://jslint.com/

запустить код через это, пока он не приходит в чистоте. Перед отправкой в ​​онлайн-инструмент обязательно очистите код (удалите учетные данные или IP-код). Вероятно, лучше загрузить инструмент и запустить его локально или использовать редактор с проверкой кода JavaScript.

В процессе производства ваш код не должен содержать никаких ошибок или предупреждений. Это значительно ограничивает пространство для запутывания поведения во время работы.

+0

@Middleware решает ваши проблемы? –

+0

Вещь, которая мне помогает, заключается в замене возврата: 'process.exit()' – MiddleWare

+1

Не делайте этого. Это взломать настоящую проблему. В производстве обходные пути, такие как выход, - это рак для качества кода. –

-1

вам нужно уменьшить счетчик вместо увеличения, в противном случае он никогда не будет меньше, чем replies.length:

for (var i=replies.length; i > 0; i--){ 
      // Upload the file with s3 client 
      uploader.on('end', function(); 
      // lengthNum--; // You don't need this anymore 
      if (i == 0){ 
       console.log("Done!") 
       return; 
      } 
     })  

приветствия

+0

Я уменьшаю его. Функция возвращается. Он печатает слово «Готово». – MiddleWare

+0

Нет, вы уменьшаете свой 'lengthNum', а не вашу переменную счетчика' i' – messerbill

+0

Но если я это сделаю, тогда я буду отрицательным числом. – MiddleWare

0

Ваша петля очень неудобна, вместо этого вы должны уменьшить счетчик и сначала инициализировать ее с помощью replies.length. В противном случае легко получить бесконечный цикл.

Также есть ошибка в последней строке цикла for, где вы передаете пустой ответ на событие end пользователя. Вы также пропустили пару точек с запятой (которые являются необязательными, но делают программу понятной).

var db = require("redis"); 
var dbclient = db.createClient(); 
function doSomeUpload() { 
     dbclient.zrangs("noper", 0, 5000, function (err, replies) { 
      for (var i = replies.length; i > 0; i--) { 
       // Upload the file with s3 client 
       uploader.on('end', function() {}); 
      } 
     }); 
}); 

doSomeUpload(); 
+0

'for (i = 0; i 0; i -)' он просто отменяет порядок индексирования, который здесь не имеет значения. –

+0

См. Часть, где он забыл закрыть функцию обратного вызова – Zorgatone

+0

Да. Я думаю, что теперь я взял все синтаксические ошибки. Является ли моя версия фиксированного кода sybtax разумной? –

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