mysqlテーブルに挿入する必要があるjson形式(または任意の形式)の値のリストがあるとしましょう。挿入後、mysql.query呼び出しの外部にresult.insertIdを公開する必要があります。それを行う方法はありますか?(なぜこれが必要なのか私に聞かないでください:私はこれを回避する方法を知っています。私はこのシナリオが可能かどうかを知る必要があります)。理想的には、各配列アイテムの説明と挿入IDが画面に出力されます。代わりに、空の配列を取得します。はい、コールバック内にconsole.logを配置することでこれを実現できることを私は知っています。それは私が必要とする答えではありません。コールバックの外部に挿入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);
console.logコマンドの後に完了するクエリコールバック関数のBrianre非同期の性質に同意するため、結果は得られません。クエリループに関して、以下のメソッドはそれをシーケンシャルにすることでそれを解決します。次のデータは、前のクエリコールバックが実行されたときに読み込まれます。
問題は、現在のメソッドで配列全体をいつ処理するかがわからないことです。最後のループがわかっている場合は、クエリコールバックの最後のステップとして配列を処理できます。その前に、配列をロードするだけです。
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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加