假设我有一个json格式(或任何格式)的值列表,我需要插入到mysql表中。在插入之后,我需要在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);
答案 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)