2

X時間ごとにクエリを実行する必要があります。次のコードを実行すると、ノードバージョン0.8.12と最新のノードmysqlを実行しています

  function testmysql()
{
    mysqlCon.connect();
    mysqlCon.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
    if (err) throw err;

    console.log('The solution is: ', rows[0].solution);
});

mysqlCon.end();
}

    var period = 2000;
    var interval  = setInterval(function(){

    testmysql();
}, period);

次のエラーが発生します。

\nodetest\node_modules\mysql\lib\protocol\Protocol.js:95
    .on('packet', function(packet) {
     ^
TypeError: Cannot call method 'on' of undefined
    at Protocol._enqueue (\nodetest\node_modules\mysql\lib\protocol\Protocol.j
s:95:6)
    at Protocol.handshake (\nodetest\node_modules\mysql\lib\protocol\Protocol.
js:37:41)
    at Connection.connect (\nodetest\node_modules\mysql\lib\Connection.js:37:1
8)
    at testmysql (\nodetest\index.js:1112:10)
    at Timer.<anonymous> (\nodetest\index.js:1143:1)
    at Timer.exports.setInterval.timer.ontimeout (timers.js:234:14)

ただし、testmysql()が別の関数にない場合は、正しく実行されます。

私は間違って何をしていますか?というか、このループクエリをどのように実行しますか?ありがとう

4

2 に答える 2

0

代わりにこれを試してください-それはより良い設計であり、うまくいけばあなたのエラーを解決するはずです:

function testmysql(mysqlConnection)
{
    mysqlConnection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
        if (err) throw err;

        console.log('The solution is: ', rows[0].solution);
    });
}

var period = 2000;
var interval  = setInterval(function(){
    var mysqlCon = mysql.createConnection({host:'localhost',user:'testadmin',password:'pass',database:'mydb'});        
    mysqlCon.connect();
    testmysql(mysqlCon);
    mysqlCon.end();
}, period);
于 2012-12-11T15:46:47.673 に答える
0

わかりました...プロジェクトを1行ずつ分解しました...そしてそれを引き起こしたコードはこれでした-

 var EventEmitter = require('events').EventEmitter
 , on = EventEmitter.prototype.on;
 EventEmitter.prototype.on = function () {
this._maxListeners = Infinity;
on.apply(this, arguments);
};

このスニペットを使用していたのは、socket.ioでredisstoreを使用しているため、誰かが参加するたびに最大リスナー制限が原因でnode_redisがエラーまたはメモリリークの警告をスローしていたためです。コードを削除しましたが、おそらく最新のnode_redisバージョンを使用したために、メモリリークエラーが発生しなくなりました。

トラブルをお詫びし、助けてくれてありがとう。

于 2012-12-12T09:31:30.160 に答える