我有一个控制台程序,用户在其中扫描序列号,然后将这些序列号添加到数据库中。
{
"name": "hi",
"details": {
"credits": 10
}
}
代码运行时,它成功连接到数据库,但查询数据库。它不断提示用户输入。
或者,我尝试将序列号存储在数组中,然后像这样循环遍历它添加每个元素。
const mysql = require('mysql2');
const read = require('readline-sync');
const conn = new mysql.createConnection(config);
conn.connect(
function(err){
if(err){
throw err;
}
else{
console.log("Connection Established");
while(1){
var sn = read.question('Scan in serial number: ');
conn.query('INSERT INTO test (serial) VALUES (?);',
[sn], function(err, results, fields){
if (err){
throw err;
}
else{
console.log("Added stuff");
}
});
}
}
}
);
在这种情况下,它的工作不一致。有时它可以正常工作,而有时它却无法连接并引发超时错误。有没有更好的方法可以做到这一点和/或我做错了什么?
答案 0 :(得分:1)
var promises = []
function dbOp(value) {
return new Promise(function(resolve, reject) {
conn.query('INSERT INTO test (serial) VALUES (?);',
[value], function (err, results, fields) {
if (err) {
return reject(err)
}
else {
console.log("Added stuff");
resolve(results)
}
}
}
conn.connect(function(err){
if(err){
throw err;
}
else{
for (i = 0; i < array.length; ++i) {
promises.push(dbOp(array[i]));
}
}
});
Promise.all(promises)
.then((results) => {
console.log("done", results);
})
.catch((e) => {
console.log(e)
});
答案 1 :(得分:0)
这可能是由于mysql服务器中的空闲超时时间设置过短引起的。 client.connect()
在mysql2中几乎是无操作的,当您调用mysql.createConnection()
时它会立即连接。您只有在收集完所有数据后才能更改顺序以建立连接:
const mysql = require('mysql2');
const read = require('readline-sync');
var array = [];
var sn = ' ';
while (1) {
sn = read.question('Scan in serial number, or enter "done" if finished scanning');
if (sn == 'done') {
const conn = mysql.createConnection(config);
array.forEach(function(sn) {
conn.query('INSERT INTO test (serial) VALUES (?);', [sn], function(err, results, fields) {
if (err) {
throw err;
} else {
console.log('Added stuff');
}
});
});
}
array.push(sn);
}