2016-11-11 46 views
2

假設我有一個需要插入到mysql表格中的json格式(或任何格式)的值列表。插入後,我需要在mysql.query調用之外暴露的result.insertId。有沒有辦法做到這一點? (請不要問我爲什麼需要這個:我知道如何解決這個問題,我只需要知道這種情況是否可行)。理想情況下,每個數組項的描述和插入標識應該打印到屏幕上。相反,我得到一個空數組。是的,我知道把console.log 裏面的的回調會實現這一點。這不是我需要的答案。是否有可能在回調之外公開插入標識?node.js mysql insert id - 如何在插入查詢之外公開insert id?

var todos = require('./todos.json'); 
var mysql = require('mysql'); 

var mysql_pool = mysql.createPool({ 
    host : 'localhost', 
    user : 'myuser', 
    password : 'mypwd', 
    database : 'mydb'}); 

var todoArray = []; 

todos.forEach(function(todo) { 
    mysql_pool.query("INSERT INTO todos(description) VALUES(?)", todo.description, function(err, result){ 
     if (err) { 
      console.log(" Unable to insert: " + err); 
      throw err; 
      } 
     todoArray.push({description: todo.description, desc_id: result.insertId}); 
    }); 
}); 

console.log(todoArray); 
+1

查詢功能是異步的,所以查詢完成之前你的console.log運行。如果你想使用這些值,你必須在回調中處理它們。你也會遇到問題,因爲你在循環中運行查詢,並且因爲它們是異步的,所以不能保證它們將以什麼順序完成。 –

+0

@BrianGlaz你爲什麼不加這個作爲答案?可能通過指向query()方法的node.js文檔的鏈接進行擴展。 – Shadow

+0

所以也許答案是使用同步方法呢? –

回答

0

我同意Brian重新異步性查詢回調函數完成後console.log命令等沒有結果。關於查詢循環,下面的方法通過使其順序來解決這個問題。當前一個查詢回調運行時,下一個數據被加載。

問題是你無法知道什麼時候用你當前的方法處理完整的數組。如果您知道最後一個循環,則可以將該數組作爲查詢回調的最後一步。在此之前你只需加載數組。

使用iterator next命令會給你下一個值和一個指示符,如果它是最後一個循環。

希望這樣的事情:

//use require to get node to parse in the json file as an object 
//set todo as iterator type 
var todos = require("./path/todos.json")[Symbol.iterator](), 
todoArray = [], 
todo = todos.next() 

//todos.next() iterator cammand returns {done: true/false, value: { }} 
//we want to know the end so we can process todoAray 

do { 
    mysql_pool.query("INSERT INTO todos(description) VALUES(?)", 
     todo.value.description, 
     function(err, result){ 
      if (err) { console.log(" Unable to insert: " + err); throw err; } 
      todoArray.push({description: todo.value.description, desc_id: result.insertId}) 
      todo = todos.next() 
      If(todo.done === true){ 
       console.log(todoArray) 
      } 
    }); 
}while (!todo.done) 
+0

這是我想要的。謝謝 –