gpt4 book ai didi

javascript - 为什么第一个程序有效而第二个程序无效?

转载 作者:行者123 更新时间:2023-11-30 21:40:57 25 4
gpt4 key购买 nike

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);
});

不同之处在于插入值数组的查询在连接函数调用之外。我知道这一定与传递给 connect 的回调函数有关,它们可能是异步函数,但有人可以纠正我或进一步详细说明吗? Node 的控制流在躲避我。

最佳答案

您需要先连接到数据库,然后才能对数据库执行查询。

connection.connect() 是一个异步函数,这意味着当您调用它时,它会开始连接到数据库并立即返回。您的代码继续,当您尝试执行查询时,数据库尚未连接到数据库。

这就是为什么在连接回调中执行查询很重要。当您的数据库连接时,回调允许您的代码在数据库成功(或不成功)完成连接时继续。

我强烈建议阅读异步编程,并研究 promises/await 语法。它们本质上允许您的代码阻塞,通过整齐地链接所有内容而不是涉及许多回调层。

promise-mysql package 使这个污垢对你来说变得简单:

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();

关于javascript - 为什么第一个程序有效而第二个程序无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639953/

25 4 0
文章推荐: mysql - 循环并使用存储的 MySql 选择
文章推荐: c# - 运行 C# 代码的 Python 包装器
文章推荐: android - 如何使用 Kotlin 将我计算机中托管的 MySQL 连接到 Android 应用程序
文章推荐: mysql - SQL/HiveQL : Is there a way to count the number of JOIN ON matches per row without a group by?