2016-11-11 4 views
2

私がmysqlテーブルに挿入する必要があるjson形式(または任意の形式)の値のリストがあるとします。挿入後、mysql.queryの呼び出しの外側にあるresult.insertIdが必要です。それを行う方法はありますか? (なぜなら、なぜこれが必要なのか私に尋ねないでください:私はこれを回避する方法を知っています。このシナリオが可能かどうかを知る必要があります)。理想的には、各配列項目の説明と挿入IDが画面に表示されます。代わりに、私は空の配列を取得します。はい、私はconsole.logをの中に入れてコールバックのがこれを達成することを知っています。それは私が必要とする答えではありません。インサートIDをコールバックの外部に公開することは可能ですか?node.js mysql insert id - 挿入クエリの外側に挿入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

私は結果をにconsole.logコマンドの後に完了していないので、クエリのコールバック関数の非同期性再ブライアンに同意します。クエリループに関して、以下の方法は、それを逐次化することによって解決する。前のクエリコールバックが実行されると、次のデータがロードされます。

問題は、現在の方法で完全配列を処理するタイミングを知ることができないことです。最後のループが分かっている場合は、配列をクエリコールバックの最後のステップとして処理できます。その前に、配列をロードするだけです。

イテレータの次のコマンドを使用すると、次の値と、最後のループの場合はインジケータが表示されます。

うまくいけば、このような何か:

//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

これは私が欲しかったものです。ありがとう –

関連する問題