Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';是否不将提取的数据发送到我的socket.io流?_Javascript_Mysql_Node.js_Websocket_Socket.io - Fatal编程技术网

Javascript Can';是否不将提取的数据发送到我的socket.io流?

Javascript Can';是否不将提取的数据发送到我的socket.io流?,javascript,mysql,node.js,websocket,socket.io,Javascript,Mysql,Node.js,Websocket,Socket.io,我正在尝试从单个mysql查询切换到mysql池连接,这样用户就可以共享一个mysql连接,但我对此一点都不熟悉(nodejs/socket.io也是新手) 以下代码是我到目前为止每秒向数组中的套接字发送数据所做的工作: var port = process.env.OPENSHIFT_NODEJS_PORT || 8000, ip = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1',

我正在尝试从单个mysql查询切换到mysql池连接,这样用户就可以共享一个mysql连接,但我对此一点都不熟悉(nodejs/socket.io也是新手)

以下代码是我到目前为止每秒向数组中的套接字发送数据所做的工作:

var 
port                = process.env.OPENSHIFT_NODEJS_PORT || 8000,
ip                  = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1',
app                 = require('http').createServer(handler),
fs                  = require('fs'),
request             = require('request'),
mysql               = require('mysql'),
moment              = require('moment'),
tz                  = require('moment-timezone'),
pool                = mysql.createPool({
connectionLimit:    100,
host:               'xxx',
user:               'xxx',
password:           'xxx',
database:           'xxx',
debug:              false,
port:               3306}),
socketArray         = [],
POLLING_INTERVAL    = 1000,
pollingTimer;
moment.tz.setDefault("Europe/Berlin");

var io = require('socket.io').listen(app);
io.set('origins', '*:*');

function time()
{
output = new Date();
output = moment().format('(H:mm:ss.SS) ');
return output;
}

function handler(req,res) 
    {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.statusCode = 200;
    res.connection.setTimeout(0);
    res.end();
}
app.listen(port,ip);

function pollingLoop () {
    if (socketArray.length === 0) {
        // no connections, wait and try again
        setTimeout(pollingLoop, POLLING_INTERVAL);
        return; // continue without sending mysql query
    }
    pool.getConnection(function(err,connection){ 
    if (err) { console.log({"code" : 100, "status" : "connection-db error"}); return; }   
    console.log('connected as id ' + connection.threadId);
    console.log('socketArray length: ' + socketArray.length);

    var selection = 
        "SELECT\
        a.`id`,a.`product_id` AS pid,a.`random` AS nr,a.`price`,a.`price_end` AS pe,\
        TIMESTAMPDIFF(SECOND,NOW(),a.`datetime`) AS duration,\
        ABS(TIMESTAMPDIFF(SECOND,NOW(),b.`date`)) AS hb\
        FROM `auctions` AS a\
        LEFT JOIN `auctions_bids` AS b ON b.`auction_id` = a.`id`\
        WHERE TIMESTAMPDIFF(SECOND,NOW(),a.`datetime`) > '-1'\
        GROUP BY a.`id`\
        ORDER BY `duration` DESC,`id` DESC LIMIT 15";   
    var streamArray = [], lg = '';                      

    var query = connection.query(selection, function(err, results, rows){
    lg += ('id: '+results[0].id+' ('+results[0].duration+') ');         

    if 
    (
    ((results[0].duration < 2 || results[0].duration <= results[0].nr) && (results[0].price <= results[0].pe)) 
    ||
    ((results[0].duration < 2 || results[0].duration <= results[0].nr) && (results[0].hb > 0 && results[0].hb < 30))
    )   
    {
    min = 3;
    max = 5;
    rand = Math.floor(Math.random()*(max-min+1)+min);
    price = results[0].price+0.01;
    price = price.toFixed(2);

    pool.query('UPDATE `auctions` SET `random` = ?,`price` = ?, `datetime` = DATE_ADD(`datetime`,INTERVAL(17-TIMESTAMPDIFF(SECOND,NOW(),`datetime`))SECOND) WHERE `id` = ?',[rand, price, results[0].id]);  
    console.log(time()+'UPDATED id '+results[0].id+': random ('+rand+') price ('+price+'€)');   
    }       
    streamArray.push(results[0]);        

    updateSockets({ streamArray: streamArray });    
    console.log("auctions pushed: " + streamArray); 
    connection.release();
    setTimeout(pollingLoop, POLLING_INTERVAL);  
    });
    console.log(time()+lg+' C: '+socketArray.length);
}); 
}
pollingLoop();

io.sockets.on('connection', function(socket) {  
    socket.on('disconnect', function() {
    clearTimeout(pollingTimer);
    var socketIndex = socketArray.indexOf(socket);
    console.log(time()+'SOCKET-ID = %s DISCONNECTED', socketIndex);
    if (~socketIndex) { socketArray.splice(socketIndex, 1); }
    });  
    console.log(time()+'NEW SOCKET CONNECTED!');
    socketArray.push(socket);
}); 

var updateSockets = function(data) {
    socketArray.forEach(function(tmpSocket) { tmpSocket.volatile.emit('stream', data); });
};

console.log(time()+'server.js executed\n');
这可以很好地显示拍卖行中的数据,但是如何在我的mysql池连接中做到这一点呢

另外,几秒钟后,我发现一个错误,
release()
甚至没有定义,但它列在mysql模块文档中。。。所以我认为我的整个逻辑过程是不正确的

  • 我应该使用connection.end()和.release()吗?因为
    连接永远不会结束
  • 我应该仍然使用
    setInterval(函数(){mysql.query('SELECT
    1'); }, 5000);如另一个要保留的StackOverflow问题中所回答 这里的联系还活着吗?()
  • (感谢您对我的一些问题给出的任何提示或答案!有答案总比没有好,因为我觉得这个话题根本没有得到太多回答。)

    编辑: 更新了我的全部代码(见上文)。现在输出如下所示:


    因此流获取数据,但在console.log中什么都没有,并且存在此javascript错误?

    您应该创建一个池,并在该池上使用getConnection。然后,连接完成后,释放它。此外,您不需要停止pollingLoop或为每个连接启动它,一个循环就足够了

    我不理解带有条件的if语句,所以省略了它。它可能需要去别的地方

    var socketArr = [];
    
    function handler(req, res) {
        res.statusCode = 200;
        res.connection.setTimeout(0);
        res.end();
    }
    app.listen(port, ip);
    var pool = mysql.createPool({
        host     : 'example.org',
        user     : 'bob',
        password : 'secret'
    });
    
    function pollingLoop () {
        if (socketArr.length === 0) {
            // no connections, wait and try again
            setTimeout(pollingLoop, 1000);
            return; // continue without sending mysql query
        }
        pool.getConnection(function (err, connection) {
            if (err) {
                console.log({
                    "code": 100,
                    "status": "Error in connection database"
                });
                return;
            }
            console.log('connected as id ' + connection.threadId);
            var selection = "SELECT * FROM auctions";
            var streamArray = [],
                lg = '';
            var query = connection.query(selection, function (err, results, fields, rows) {
                lg += ('id: ' + results[0].id + ' (' + results[0].duration + ') ');
                /*if (conditions) {
                    var query_update = connection.query('UPDATE `auctions` SET `price` = ? WHERE `id` = ?', [price, auction.id]);
                    console.log(time() + 'UPDATED id ' + auction.id + ': price (' + price + '€)');
                }*/
                streamArray.push(results);
                updateSockets({
                    streamArray: streamArray
                });
                console.log("auctions pushed: " + streamArray);
                connection.release();
                setTimeout(pollingLoop, 1000);
            });
            console.log(time() + lg + ' C: ' + socketArr.length);
        });
    }
    // start loop
    pollingLoop();
    
    io.sockets.on('connection', function (socket) {
        socket.on('disconnect', function () {
            var socketIndex = socketArr.indexOf(socket);
            console.log(time() + 'SOCKET-ID = %s DISCONNECTED', socketIndex);
            if (~socketIndex) {
                socketArr.splice(socketIndex, 1);
            }
        });
        console.log(time() + 'NEW SOCKET CONNECTED!');
        socketArr.push(socket);
    });
    var updateSockets = function (data) {
        socketArr.forEach(function (tmpSocket) {
            tmpSocket.volatile.emit('stream', data);
        });
    };
    

    这就是我现在的输出和你的代码:它似乎没有得到应有的数据。
    var socketArr = [];
    
    function handler(req, res) {
        res.statusCode = 200;
        res.connection.setTimeout(0);
        res.end();
    }
    app.listen(port, ip);
    var pool = mysql.createPool({
        host     : 'example.org',
        user     : 'bob',
        password : 'secret'
    });
    
    function pollingLoop () {
        if (socketArr.length === 0) {
            // no connections, wait and try again
            setTimeout(pollingLoop, 1000);
            return; // continue without sending mysql query
        }
        pool.getConnection(function (err, connection) {
            if (err) {
                console.log({
                    "code": 100,
                    "status": "Error in connection database"
                });
                return;
            }
            console.log('connected as id ' + connection.threadId);
            var selection = "SELECT * FROM auctions";
            var streamArray = [],
                lg = '';
            var query = connection.query(selection, function (err, results, fields, rows) {
                lg += ('id: ' + results[0].id + ' (' + results[0].duration + ') ');
                /*if (conditions) {
                    var query_update = connection.query('UPDATE `auctions` SET `price` = ? WHERE `id` = ?', [price, auction.id]);
                    console.log(time() + 'UPDATED id ' + auction.id + ': price (' + price + '€)');
                }*/
                streamArray.push(results);
                updateSockets({
                    streamArray: streamArray
                });
                console.log("auctions pushed: " + streamArray);
                connection.release();
                setTimeout(pollingLoop, 1000);
            });
            console.log(time() + lg + ' C: ' + socketArr.length);
        });
    }
    // start loop
    pollingLoop();
    
    io.sockets.on('connection', function (socket) {
        socket.on('disconnect', function () {
            var socketIndex = socketArr.indexOf(socket);
            console.log(time() + 'SOCKET-ID = %s DISCONNECTED', socketIndex);
            if (~socketIndex) {
                socketArr.splice(socketIndex, 1);
            }
        });
        console.log(time() + 'NEW SOCKET CONNECTED!');
        socketArr.push(socket);
    });
    var updateSockets = function (data) {
        socketArr.forEach(function (tmpSocket) {
            tmpSocket.volatile.emit('stream', data);
        });
    };