javascript - 无法在 javascript 循环中从数据库中获取数据
问题描述
我在nodejs中使用MySQL模块来读取每一行中的特定列以查看它是否为空,将同一行上的另一列发送到Web服务以处理该值以填充空值。
这是我的代码:
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123456789',
database : 'bank114'
});
var total_rows;
connection.connect();
connection.query('SELECT count(*) from bank114_x;', function (error, results, fileds) {
total_rows = results[0]['count(*)'];
console.log(total_rows);
iterator();
});
function iterator(){
for (var i = 1; i <= total_rows; i++) {
fetch_data(i)
}
}
function fetch_data(id){
connection.query({
sql: 'SELECT * FROM `bank114_x` WHERE `id` = ?',
timeout: 40000, // 40s
},
[id],
function (error, results, fields) {
console.error(error);
if (results[0].f6781 == null){
//send f6780 column to a webservice to calculate f6781
}
}
);
}
connection.end();
问题是,我可以在表的单行上执行此操作(results[0]
返回行),但是当我使用 for 循环遍历表中的所有行时,出现错误:
{ Error: Cannot enqueue Query after invoking quit.
at Protocol._validateEnqueue (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:204:16)
at Protocol._enqueue (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:139:13)
at Connection.query (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/Connection.js:208:25)
at fetch_data (/mnt/sdb2/WebstormProjects/translator/main.js:29:16)
at iterator (/mnt/sdb2/WebstormProjects/translator/main.js:23:9)
at Query._callback (/mnt/sdb2/WebstormProjects/translator/main.js:18:5)
at Query.Sequence.end (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)
at Query._handleFinalResultPacket (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Query.js:139:8)
at Query.EofPacket (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Query.js:123:8)
at Protocol._parsePacket (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:279:23) code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }
/mnt/sdb2/WebstormProjects/translator/main.js:36
if (results[0].f6780 == null){
^
TypeError: Cannot read property '0' of undefined
at Query._callback (/mnt/sdb2/WebstormProjects/translator/main.js:36:24)
at Query.Sequence.end (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)
at /mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:225:14
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
o 使用 javascript 的异步流程做一些事情。我该如何解决?
解决方案
事实证明,由于 javascript 中的异步流程,我connection.end();
在从数据库中获取数据之前到达。所以这是一个解决我的问题的解决方法:
function fetch_data(id){
connection.query({
sql: 'SELECT * FROM `bank114_x` WHERE `id` = ?',
timeout: 40000, // 40s
},
[id],
function (error, results, fields) {
if (results[0].f6781 == null){
//send f6780 column to a webservice to calculate f6781
}
}
);
if (id == total_rows)
{
connection.end();
}
}
推荐阅读
- angular - ngx-toastr 无法在 Visual Studio 2017 上使用 Angular 处理 webapi
- android - NestedScrollView 被 recyclerview 卡住了
- jquery - 引导日期时间选择器验证
- c++ - 围绕变量“名称”的堆栈已损坏 C++
- javascript - 如何将公式拖入空单元格(仅一列)?Google Apps 脚本
- batch-file - win7 任务调度器自动切换用户
- javascript - 使用键盘导航选择项目时如何加载页面
- java - 数据报接收方法在java中不接收数据
- asynchronous - angular5如何提出asyc请求?
- android - AltBeacon 库仅第一次显示信标,然后停止显示它们