在node-mysql中插入完成之前closures连接

我的代码是

var thdb = require('./module/thdb.js'); var csv = require('./module/readcsv.js'); var db = new thdb.database('root','root','localhost','TH_DB'); var CSVdata= new Array(); var csv_row=0; csv.readFile('data.txt',",",true,function(data){ CSVdata[csv_row]=data; csv_row++; },function(count){ for(var k=0;k<CSVdata.length;k++) { var data=CSVdata[k]; (function(){ var data_copy=data; db.checkSymbol(data_copy.Symbol,function(exist){ if(exist) { //write log console.log('Nost Inserting: '+data_copy.Symbol); } else { //write log var data_copy2=data_copy; var db_copy=db; console.log('Inserting: '+data_copy2.Symbol); //insert var DataObj = { Exchange_id:1, Currency_id:1, symbol: data_copy2.Symbol, name:data_copy2.Name }; db_copy.insertSecurity(DataObj); }//close exist else });//close check db })(); } db.close(); }); 

我有一个错误

 Not Inserting: E Not Inserting: X Not Inserting: Z Error: No database selected at Function._packetToUserObject (/Users/saturngod/Dropbox/th/node_modules/mysql/lib/client.js:384:7) at Query._handlePacket (/Users/saturngod/Dropbox/th/node_modules/mysql/lib/query.js:33:33) at Client._handlePacket (/Users/saturngod/Dropbox/th/node_modules/mysql/lib/client.js:309:14) at Parser.<anonymous> (native) at Parser.emit (events.js:64:17) at /Users/saturngod/Dropbox/th/node_modules/mysql/lib/parser.js:71:14 at Parser.write (/Users/saturngod/Dropbox/th/node_modules/mysql/lib/parser.js:576:7) at Socket.<anonymous> (native) at Socket.emit (events.js:64:17) at Socket._onReadable (net.js:678:14) 

如果我不closures数据库连接,它工作正常。 但是,我在循环结束时closures了数据库连接,我总是遇到一个错误。

问题是JavaScript是asynchronous的,所以你在那里做的大部分事情都不会试图在db.close执行之后运行。 你有for循环将调用checkSymbol,但是所做的只是发送查询。 它将保持循环并发送更多,然后closures连接,如果有响应发生,连接将被closures。

我会build议安装节点asynchronous模块,以帮助这一些。 https://github.com/caolan/async#iterator

我从来没有使用THDB,但我会假设有一个'insertSecurity'的第二个参数,这是插入完成时调用的函数。

这里是一些示例代码。

 var async = require('async'); var thdb = require('./module/thdb.js'); var csv = require('./module/readcsv.js'); var db = new thdb.database('root','root','localhost','TH_DB'); var dataFunctions = []; function processData(data, callback) { db.checkSymbol(data.Symbol, function(exist){ if(exist) { console.log('Nost Inserting: '+data.Symbol); callback(); } else { console.log('Inserting: '+data.Symbol); var DataObj = { Exchange_id:1, Currency_id:1, symbol: data.Symbol, name: data.Name }; db_copy.insertSecurity(DataObj, function () { callback(); }); } }); } csv.readFile('data.txt', ',', true, function(data) { dataFunctions.push(function(cb) { processData(data, cb); }); }, function (count) { async.series(dataFunctions, function() { console.log('Everything inserted!'); }) }); 

function完成后为什么不closures?