节点js gettting活动超时错误或数据库连接丢失

时间:2016-02-08 13:13:24

标签: node.js

我正在使用node js脚本将数据(针对多个用户)从GeoTab服务器API同步到我的本地数据库并使用下面的代码

     var syncUsers = function () {
     for (var i = 0; i < geotabUsers.length; i++) {


         if (apiInstanse[geotabUsers[i].userId] == undefined)
         {
              apiInstanse[geotabUsers[i].userId] = new API(geotabUsers[i].apiUsername, geotabUsers[i].apiPassword, geotabUsers[i].apiDatabase, js_lang.GEOTAB_SERVER);
          }

          syncStatusData(apiInstanse[geotabUsers[i].userId], i, userInfo[geotabUsers[i].userId].statusDataFromVersion, geotabUsers[i].userId, userInfo[geotabUsers[i].userId].currentCompany, geotabUsers[i].apiUsername, geotabUsers[i].apiPassword, geotabUsers[i].apiDatabase);

}



var syncStatusData = function (api, i, fromVersion, userId, currentCompany, apiUsername, apiPassword, apiDatabase){

try {
    api.call(js_lang.GEOTAB_GETFEED_METHOD, {
        typeName: js_lang.GEOTAB_STATUS_DATA,
        resultsLimit: js_lang.GEOTAB_API_LIMIT,
        fromVersion: fromVersion
    }, function (err, data) {

        if (err) {
            console.log('api Call Error:', userId);
            console.log('apiUsername:', apiUsername);
            console.log('apiPassword:', apiPassword);
            console.log('apiDatabase:', apiDatabase);
            console.log('Error', err);
            apiInstanse[userId] = new API(apiUsername, apiPassword, apiDatabase, js_lang.GEOTAB_SERVER);
            return;
        }

        var insertStatus = [];

        var sql = "INSERT INTO " + js_lang.TABLE_STATUS_DATA + " (companyId,dateTime,deviceId ,diagnosticId,value,version,uniqueId,userId,unitOfMeasure ) VALUES ?";


        //iterate data
        if (data.data != undefined)
        {
            for (var key in data.data) {

                if (diagnosticList[data.data[key].diagnostic.id] == undefined)
                {
                    continue;
                }

                var thisDate = moment(new Date(data.data[key].dateTime));

                var thisDayDate = thisDate.format("YYYY-MM-DD");

                //prepare data to insert
                var insertRow = [
                    currentCompany,
                    thisDate.format("YYYY-MM-DD HH:MM:ss"),
                    data.data[key].device.id,
                    data.data[key].diagnostic.id,
                    data.data[key].data,
                    data.data[key].version,
                    data.data[key].id,
                    userId,
                    diagnosticList[data.data[key].diagnostic.id].unitOfMeasure
                ];
                insertStatus.push(insertRow);

                var todayDate = moment(new Date());
                var todayDayDate = todayDate.format("YYYY-MM-DD");

                //send alert in case of current day data
                if (todayDayDate == thisDayDate)
                {
                    //send mails in case of high pressure
                    if (diagnosticList[data.data[key].diagnostic.id].unitOfMeasure == js_lang.GEOTAB_PRESSURE_UNIT_STR &&
                            data.data[key].data > js_lang.MAX_PRESSURE &&
                            alertTemplates[userId] != undefined)
                    {
                        console.log('alert time');


                        if (alertTemplates[userId] != undefined)
                        {

                            for (var templateIndex = 0; templateIndex < alertTemplates[userId].length; templateIndex++) {
                                var template = alertTemplates[userId][templateIndex];
                                var res = template.devices.split(",");

                                var index = FUNCTION_CLASS.contains.call(res, data.data[key].device.id)

                                if (index)
                                {
                                    var emailSubject = 'High Pressure Alert';

                                    if (userDevices[userId][data.data[key].device.id].name != undefined)
                                    {
                                        var emailText = 'Vehicle:' + userDevices[userId][data.data[key].device.id].name;
                                    }
                                    else
                                    {
                                        var emailText = '';
                                    }

                                    var toEmails = template.emails;

                                    var emailHtml = 'Vehicle:' + userDevices[userId][data.data[key].device.id].name + '<br>' + diagnosticList[data.data[key].diagnostic.id].name + ' <br> value:' + data.data[key].data + ' ' + js_lang.GEOTAB_PRESSURE_UNIT_PA + '<br>\
' + js_lang.DATE_TIME + ':' + thisDate.format("YYYY-MM-DD HH:MM:ss");

                                    //call mail function
                                    sendEmail(toEmails, emailSubject, emailText, emailHtml);

                                }


                            }
                        }



                    }
                }

            }
        }

        if (insertStatus.length > 0)
        {
            connection.query(sql, [insertStatus], function (err) {
                if (err)
                    throw err;                 

                connection.query('UPDATE ' + js_lang.TABLE_USER + ' SET statusDataFromVersion = ? WHERE id = ?',
                        [data.toVersion, userId]);

            });
        }
        else {
            console.log('update user:', userId);

            connection.query('UPDATE ' + js_lang.TABLE_USER + ' SET statusDataFromVersion = ? WHERE id = ?',
                    [data.toVersion, userId]);



        }

        if ((geotabUsers.length - 1) == i)
        {
            console.log('loop ended');
            continueSync();
        }
    });
}
catch (e) {
    continueSync();
}

}

var continueSync = function () {
setTimeout(function () {

    connection.end();

    geotabUsers = [];
    userDevices = [];
    diagnosticList = [];
    userInfo = [];
    alertTemplates = {};

    eventEmitter.emit('getUsers');
}, 60000);

}

它的工作很好,几次迭代,但得到随机错误,如

    events.js:85
          throw er; // Unhandled 'error' event
            ^
Error: Quit inactivity timeout

或者

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: Connection lost: The server closed the connection.

1 个答案:

答案 0 :(得分:0)

我在本地执行应用程序时遇到此错误,要删除问题我已使用pm2节点模块进行进程管理。现在它正常工作。