2017-02-24 144 views
0

爲了簡單起見,我縮短了node.js應用程序。調試節點JS邏輯

在我的服務器中,我已經複製了一段代碼,試圖弄清楚什麼是錯的。從邏輯上講,它應該工作。

// Subscribed to email service 
app.get('/subscribe', function(req, res) { 
    var emailExist = false; 
    // Email to add 
    var from = req.query.from; 
    // Iterate through file and check to see if the email given exist or not. 

    var readFile = fs.createReadStream("./Database/Subscription.txt"); 

    var readline = rl.createInterface({ 
     input: readFile, 
     terminal: false, 
    }); 

    readline.on('line', function(line) { 
     if (line == from) { 
      emailExist = true; 
      console.log(line + " " + emailExist); 
     } 
    }); 

    console.log("hello " + emailExist); 

    // If email dosn't exist 
    if (emailExist === false) { 
     console.log("I am false and need to be created"); 

     fs.appendFile("./Database/Subscription.txt", from + "\n", function(err) { 
      if (err) { 
       return console.log(err); 
      } 
      console.log(from + " was added to the email subscription."); 
     }); 
    } 
}); 

如上面的代碼片段所示,它逐行讀取以確定用戶提交的電子郵件是否存在於Subscription.txt中。那麼我實際上有大約7個副本,它將emailExist變量從false更改爲true。但是,它將它設置爲false時調用它的函數。下面是我的控制檯輸出: Console Output

有什麼想法爲什麼發生這種情況?

+1

安裝Chrome。 在您的終端: 'node --inspect --debug --debug-brk path/to/script.js' –

+4

閱讀javascript中的異步回調,特別是涉及readline的地方。您的主線邏輯完成後,您的readline回調會發生。 – DrC

回答

0

簡單的辦法是你需要的一切移動readline的事件處理中:

readline.on('line', function(line) { 
    if (line == from) { 
     emailExist = true; 
     console.log(line + " " + emailExist); 
    } 


    console.log("hello " + emailExist); 

    // If email dosn't exist 
    if (emailExist === false) { 
     console.log("I am false and need to be created"); 

     fs.appendFile("./Database/Subscription.txt", from + "\n", function(err) { 
      if (err) { 
       return console.log(err); 
      } 
      console.log(from + " was added to the email subscription."); 
     }); 
    } 
}); 

這樣做的原因是,readline的不等待從終端輸入。而是傳遞一個事件處理函數(您的on('line')函數),如果有傳入輸入,它將調用它。注意:readline是誰會調用這個函數。你只是將它傳遞給readline,而不是調用它。因此,on內部的函數將在未來被調用,而不是現在(這是一些語言稱之爲「期貨」類型編程的原因之一)。

可以提高可讀性位(和減少回調地獄)通過重構邏輯成一個函數:

function processEmail (exist, callback) { 
    console.log("hello " + exist); 

    // If email dosn't exist 
    if (exist === false) { 
     console.log("I am false and need to be created"); 

     fs.appendFile("./Database/Subscription.txt", from + "\n", function(err) { 
      if (err) { 
       if (callback) callback(err); 
      } 
      else { 
       console.log(from + " was added to the email subscription."); 
       callback(null); 
      } 
     }); 
    } 
} 

readline.on('line', function(line) { 
    if (line == from) { 
     emailExist = true; 
     console.log(line + " " + emailExist); 
    } 

    processEmail(emailExist); 
}); 

還有其他的方法,以使代碼更好的念想承諾和異步/的await但要在深入研究promises或async/await之前,你必須明白異步代碼是如何工作的以及回調是什麼,因爲它們不會消除代碼的異步性質,只會使語法看起來不同。