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

标签 mysql node.js

我的代码是

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)

如果我不关闭数据库连接,它工作正常。然而,我在循环结束时关闭数据库连接,我总是得到一个错误。

最佳答案

问题是 javascript 是异步的,所以你在那里做的大部分事情在 db.close 执行之后才会尝试运行。您拥有的 for 循环将调用 checkSymbol,但所做的只是发送查询。它会一直循环发送更多,然后关闭连接,然后如果恰好有响应进来,连接就会关闭。

我建议安装 Node 异步模块,以帮助解决其中的一些问题。 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!');

  })
});

关于mysql - 在 node-mysql 中插入完成之前关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7137419/

相关文章:

javascript - "done() called multiple times" Mocha 月鹅

javascript - 如何读取NodeJS表单数据并写入MongoDB

mysql - mysql 存储过程中出现错误#1064

php - 选择类别和文章

node.js - 如何防止 session 覆盖另一个 session

javascript - 回调 Node js中未定义的响应?

node.js - 在 Google Home 助理上播放 MP3 列表

php - 从数据库中获取产品的特定数据

mysql - 分页 Hibernate JPA : orderBy + setFirstResult + setMaxResult

mysql - 检查纬度/经度组合是否位于多边形内