javascript - 为什么第一个程序有效而第二个程序无效?
问题描述
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);
});
});
这工作得很好,并且符合我的意图,如果表不存在,则创建包含名称和年龄列的表,然后相应地在值数组中插入值。
这不起作用
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);
});
不同之处在于插入值数组的查询在连接函数调用之外。我知道这必须与传递给连接的回调函数有关,它们可能是异步函数,但是有人可以纠正我或进一步详细说明吗?节点的控制流让我望而却步。
解决方案
您需要先连接到数据库,然后才能对数据库执行查询。
connection.connect()
是一个异步函数,这意味着当你调用它时,它开始连接数据库并立即返回。您的代码继续运行,当您尝试执行查询时,数据库尚未连接到数据库。
这就是为什么在连接回调中执行查询很重要的原因。当您的数据库连接时,回调允许您的代码在数据库成功(或不成功)完成连接时继续。
我强烈建议阅读异步编程,并查看 promises/await 语法。它们基本上允许您的代码阻塞,通过整齐地链接所有内容而不是涉及许多多层回调。
该promise-mysql
包装使您的污垢变得简单:
const mysql = require('promise-mysql');
const connection = mysql.createConnection({
host : 'localhost',
user : 'user',
password : 'pass',
database : 'mydb'
});
const values = [
['Dave', 20],
['Judd', 22],
['Snek', 24],
['Dale', 26]
];
async main() {
const dbErr = await connection.connect();
if (dbErr) {
return console.error('error: ' + dbErr.message);
}
{
const 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
)`;
const [err, results, fields] = await connection.query(createTodos);
}
{
const insertSiblings = 'insert into siblings (name, age) values ?';
const [err, results, fields] = await connection.query(insertSiblings);
console.log("Number of records inserted: " + result.affectedRows);
}
}
// Call the async function
main();
推荐阅读
- c# - Estimote 信标和 Xamarin 表单
- vba - 在vba中将值设置为过滤的excel范围
- javascript - Ag-Grid 在新数据源上重置滚动
- excel - SAS - 用百分比格式化 proc 报告总计
- javascript - 如果存在成对的大括号,则只允许特定的字符串正则表达式
- javascript - JS 命令禁止字母,只允许数字(光盘机器人)
- css - 将边框底部应用于引导程序 4 中的活动项目后,导航项目未在同一行中对齐
- javascript - 如何避免打字稿出现空白
- javascript - 自定义计数器 VueJS
- python - 通过函数参数访问 Python 预定义的数组名称