node.js - node-mysql无法处理多个查询?

标签 node.js asynchronous connection node-mysql

我正在使用:node-mysql

arrtickers 获得了大约 200 个值。

arrtickers 闭包将值传递到 sym 中。

sym 会将值传递给每个函数(以异步模式运行,每个 fn 将开始自行运行,而不等待前一个 fn 完成)

这里的问题是mysql似乎无法处理多个调用?

events.js:48
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: reconnection attempt failed before connection was fully set up
    at Socket.<anonymous> (/home/ubuntu/node/node_modules/mysql/lib/client.js:67:28)
    at Socket.emit (events.js:64:17)
    at TCP.onread (net.js:398:51)


        arrtickers.forEach(function(value) {

            var sym= value;


            (function(sym) {

                    url2= "http://test2.com/quote.ashx?t="+sym+"&ty=c&ta=1&p=d&b=1";

                    request({ uri:url2 }, function (error, response, body) {

                      jsdom.env({
                        html: body,
                        scripts: [
                          jqlib
                        ]
                      }, function (err, window) {

                        var $ = window.jQuery;
                        var data= $('body').html();
                        //some scrapping

                        var client2 = mysql.createClient({
                          user: 'root',
                          password: '123',
                            host: '127.0.0.1',
                            port: '3306'
                        });

                        client2.query('USE testtable');

                        sql= "update tbla SET a='"+a+"', b='"+b+"', c='"+c+"', d='"+d+"' where ticker='"+sym+"'";

                        client2.query(  
                             sql, function(err, info){

                                if (err) {  
                                  throw err;  
                                }  
                            }
                        );

                        client2.end();


                      });
                    });

            })(sym);



            (function(sym) {

                    url= "http://test3.com/quote.ashx?t="+sym+"&ty=c&ta=1&p=d&b=1";

                    request({ uri:url3 }, function (error, response, body) {

                      jsdom.env({
                        html: body,
                        scripts: [
                          jqlib
                        ]
                      }, function (err, window) {

                        var $ = window.jQuery;
                        var data= $('body').html();
                        //some scrapping

                        var client3 = mysql.createClient({
                          user: 'root',
                          password: '123',
                            host: '127.0.0.1',
                            port: '3306'
                        });

                        client3.query('USE testtable');

                        sql= "update tbla SET a='"+a+"', b='"+b+"', c='"+c+"', d='"+d+"' where ticker='"+sym+"'";

                        client3.query(  
                             sql, function(err, info){

                                if (err) {  
                                  throw err;  
                                }  
                            }
                        );

                        client3.end();


                      });
                    });

            })(sym);






            (function(sym) {

                    url= "http://test4.com/quote.ashx?t="+sym+"&ty=c&ta=1&p=d&b=1";

                    request({ uri:url4 }, function (error, response, body) {

                      jsdom.env({
                        html: body,
                        scripts: [
                          jqlib
                        ]
                      }, function (err, window) {

                        var $ = window.jQuery;
                        var data= $('body').html();
                        //some scrapping

                        var client4 = mysql.createClient({
                          user: 'root',
                          password: '123',
                            host: '127.0.0.1',
                            port: '3306'
                        });

                        client4.query('USE testtable');

                        sql= "update tbla SET a='"+a+"', b='"+b+"', c='"+c+"', d='"+d+"' where ticker='"+sym+"'";

                        client4.query(  
                             sql, function(err, info){

                                if (err) {  
                                  throw err;  
                                }  
                            }
                        );

                        client4.end();


                      });
                    });

            })(sym);



            //same function repeat for test5.com, test6.com, test7.com, test8.com, test9.com



        });

下面是 client.js 的部分代码(node-mysql 的一部分) 我真的不明白整个过程是如何联系在一起的,你们知道吗?

Client.prototype._connect = function() {
  this.destroy();

  var socket = this._socket = new Socket();
  var parser = this._parser = new Parser();
  var self = this;

  socket
    .on('error', this._connectionErrorHandler())
    .on('data', parser.write.bind(parser))
    .on('end', function() {
      if (self.ending) {
        // @todo destroy()?
        self.connected = false;
        self.ending = false;

        if (self._queue.length) {
          self._connect();
        }

        return;
      }

      if (!self.connected) {
        this.emit('error', new Error('reconnection attempt failed before connection was fully set up'));
        return;
      }

      self._connect();
    })
    .connect(this.port, this.host);

  parser.on('packet', this._handlePacket.bind(this));
};

最佳答案

您可以使用node-mysql-queues模块,它是您正在使用的当前模块的包装器。以下是信息:https://github.com/bminer/node-mysql-queues

来自其页面的多重查询示例:

var q = client.createQueue();
q.query(...); 
q.query(...);
q.execute();

client.query(...); //Will not execute until all queued queries (and their callbacks) completed.

关于node.js - node-mysql无法处理多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9576900/

相关文章:

Swift Alamofire SwiftyJSON 异步/同步类方法

javascript - javascript 中的 Web 套接字连接是入站连接吗?

node.js - 使用 sequelize 检索链接状态字段的值

javascript - Req.body为空node.js和express

javascript - 通过二进制套接字将 Uint16Array 表单浏览器发送到 node.js

javascript - javascript代码的异步执行

c++11 - 为什么在使用异步操作时没有堆栈溢出?

javascript - 在按钮ejs中打开另一个ejs文件

java - Spring 未分类SQLException : ORA-01012

android - CN1 连接 - 公共(public)场所互联网不稳定的担忧