var mysql = require('mysql')
var connection = mysql.createConnection({
host : 'localhost',
user : 'user',
password : 'pass',
database : 'mydb'
})
var values = [ ['Dave', 20],
['Judd', 22],
['Snek', 24],
['Dale', 26]
];
connection.connect(function(err) {
if (err) {
return console.error('error: ' + err.message);
}
let createTodos = `create table if not exists siblings(
id int primary key auto_increment,
name varchar(255)not null,
age tinyint(2) not null default 0
)`;
connection.query(createTodos, function(err, results, fields) {
if (err) {
console.log(err.message);
}
});
var sql = 'insert into siblings (name, age) values ?';
connection.query(sql, [values], function (err, result) {
if (err) throw err;
console.log("Number of records inserted: " + result.affectedRows);
});
});
这工作得非常好,并且达到了我的目的,如果表不存在,那么创建一个包含name和age列的表,然后在值数组中相应地插入值。
这行不通
var mysql = require('mysql')
var connection = mysql.createConnection({
host : 'localhost',
user : 'user',
password : 'pass',
database : 'mydb'
})
var values = [ ['Dave', 20],
['Judd', 22],
['Snek', 24],
['Dale', 26]
];
connection.connect(function(err) {
if (err) {
return console.error('error: ' + err.message);
}
let createTodos = `create table if not exists siblings(
id int primary key auto_increment,
name varchar(255)not null,
age tinyint(2) not null default 0
)`;
connection.query(createTodos, function(err, results, fields) {
if (err) {
console.log(err.message);
}
});
});
var sql = 'insert into siblings (name, age) values ?';
connection.query(sql, [values], function (err, result) {
if (err) throw err;
console.log("Number of records inserted: " + result.affectedRows);
});
不同之处在于,插入值数组的查询在connect函数调用之外。我知道这一定与传递给connect的回调函数有关,而且它们可能是异步函数,但是有人能纠正我的错误或进一步说明吗?节点的控制流正在躲避我。
3条答案
按热度按时间5w9g7ksd1#
在第二个代码中,您将查询放在connection.connect(函数(err)外部{
在第一个里面。
7tofc5zh2#
您需要先连接到数据库,然后才能对数据库执行查询。
connection.connect()
是一个异步函数,这意味着当您调用它时,它开始连接到数据库并立即返回。您的代码仍在继续,当您尝试执行查询时,数据库尚未连接到数据库。这就是为什么在连接回调中执行查询很重要的原因。连接数据库后,当数据库成功(或未成功)完成连接时,回调允许代码继续。
我强烈建议阅读异步编程,并研究promises/await语法。它们本质上允许您的代码阻塞,方法是将所有内容整齐地链接起来,而不是涉及许多层的回调。
这个
promise-mysql
套餐让您轻松搞定:bd1hkmkf3#
问题是,连接操作可能需要一些时间才能完成。在第一个示例中,由于后续调用包含在回调中,因此它们仅在与数据库建立连接之后发生。
在第二种情况下,由于查询位于要连接的回调之外,因此在建立连接之前尝试查询,因此查询失败。
即使在第一个示例中,在创建表的调用和随后查询表的调用之间也存在相同的错误。但是,创建表的调用很可能发生得太快,以至于在大多数情况下它只能工作,但您肯定会时不时地看到失败。
使用回调编写此序列的正确方法是按如下方式链接它们: