2017-08-05 37 views
0

我想在檢查數據庫表中是否已經存在數據之前插入數據?如果存在,則循環繼續執行控制檯消息「已存在」,如果不存在,則嘗試插入表中。但是一些記錄已經在數據庫表中,然後也插入到表中。選擇並插入節點循環不按預期方式工作

關注我的代碼的NodeJS

(function loop(index){ 
      if(index==apires.items.length){  
       console.log("Cron completed");    
       res.send("Cron completed"); 
       return false; 
      } 
      inventoryObj = apires.items[index]; 
      hash_name = inventoryObj.market_hash_name; 

      db.query('SELECT market_hash_name FROM inventory_master WHERE market_hash_name = "'+hash_name+'"', function(err,result, fields){ 
       if(result.length){ 
        console.log('already exist'); 
        loop(++index); 
       } 
       else 
       { 
        var post = {data_here}; 
        var query = db.query('INSERT INTO inventory_master SET ?', post, function (error, results, fields) { 
        if (error) throw error;   
         loop(++index); 
        }); 
       } 
      });  
     })(0); 

回答

1

我想這是因爲你的代碼的異步行爲發生。您可以使用async庫使其工作,這將允許您的代碼一次執行元素。示例

// assuming apires.itemsis an array 
async.each(apires.items, function(inventoryObj, callback) { 

      hash_name = inventoryObj.market_hash_name; 

      db.query('SELECT market_hash_name FROM inventory_master WHERE market_hash_name = "'+hash_name+'"', function(err,result, fields){ 
       if(result.length){ 
        console.log('already exist'); 
        callback('success'); // go for next iteration 
       } 
       else 
       { 
        var post = {data_here}; 
        var query = db.query('INSERT INTO inventory_master SET ?', post, function (error, results, fields) { 
        if (error) throw error;   
         callback('success'); // go for next iteration 
        }); 
       } 
      });  
}, function(err) { 
    //once all finished, it will come here,if no error occurred then err will be null 
}); 
+0

感謝您的回覆。我會嘗試。你能告訴我我的代碼在哪裏嗎?只是爲了我的信息,我在問。 – Sadikhasan

+0

每當在節點js中發生輸入輸出操作時,線程就不會等待I/O操作完成,並且它將轉至您的循環的下一次迭代。所以沒有清晰的代碼執行順序。這種異步方法將確保您的所有記錄都以相同的順序處理。 –

+0

我按照nodejs規則和語法使用回調函數。你能指出我的代碼實際上錯了嗎? – Sadikhasan

相關問題