node.js mysql insert id - 如何在insert查询之外公开insert id?

时间:2016-11-11 16:02:42

标签: javascript mysql node.js

假设我有一个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);

1 个答案:

答案 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)