Скрипт Node.js зависает при использовании MySQL с Socket.io без сбоев - PullRequest
0 голосов
/ 23 февраля 2019

Я суперновинец для Node.js, пришедший из PHP-фона, но в настоящее время я работаю над проектом, который требует какой-то открытой связи между веб-сервером и браузером.

Сценарийпредназначены для передачи двух наборов данных: список запланированного персонала, который был сопоставлен со списком сотрудников, работающих по расписанию, и набор данных, относящихся к состоянию автомобиля.По независящим от меня причинам запланированные данные о персонале и транспортном средстве находятся на сервере MySQL, а синхронизированные данные - на отдельном сервере MsSQL.

Проблема, с которой я сталкиваюсь, заключается в том,он должен делать, через определенное время (иногда минуты, иногда больше суток) он перестает что-либо делать.Таймеры setInterval для функций останавливаются и перестают обслуживать страницу socket.io.js на стороне клиента.

Я думаю, что именно так я управляю своими соединениями SQL, но я не совсем уверен, и даже еслиЯ был, я не совсем уверен, где я иду не так здесь.Ошибки не выводятся на консоль.Я часами пытался найти решение, но не смог найти ничего, что соответствовало бы моим обстоятельствам.

Вот код целиком (изменена информация о соединении SQL для соображений безопасности).

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http, {
    forceNew: true
});
var moment = require('moment');
var mssql = require('mssql');
var mssql_connection = new mssql.ConnectionPool({
    pool: {
        max: 10
    },
    server: 'hostname',
    user: 'user',
    password: 'password',
    database: 'database'
});
mssql_connection.connect();
var mysql = require('mysql');
var mysql_connection = mysql.createPool({
    connectionLimit: 20,
    host: 'hostname',
    user: 'user',
    password: 'password',
    database: 'database'
});

app.get('/', function (req, res) {
    red.end();
});

http.listen(3000, function () {
    console.log('listening on *:3000');
});


// Create function to refresh all data that must be grabbed every 5 seconds.

function refreshSchedule() {

    return new Promise(function (resolve, reject) {


        try {

            mysql_connection.getConnection(function (err, connection) {


                // Query MySQL database for timepunch entries matching MsSQL results.
                connection.query('SELECT * FROM view_schedule WHERE active = 1 AND start <= ' + moment().format("X") + ' AND finish > ' + moment().format("X") + ' ORDER BY job,start ASC', function (err, mysql_result, fields) {

                    if (err) {
                        connection.release();
                        console.log(err);
                        return;
                    }
                    resolve(mysql_result);


                });

            });


        } catch (e) {
            console.log(e);
        }


    });
}

function refreshTimeclock(schedule) {

    return new Promise(function (resolve, reject) {

        var timestamp = moment().format("X") - (60 * 60 * 12);

        const request = new mssql.Request(mssql_connection);
        request.query('SELECT SCHDHISTID,DATETIMESTART,DATETIMEEND,PERSID,PERSCODE,LNAME,FNAME FROM dbo.VWSCHDHIST WHERE DATETIMESTART >= \'' + moment(timestamp, "X").format("YYYY-MM-DD HH:mm:ss.SSS") + '\'', (err, mssql_result) => {
            if (err) {
                connection.release();
                console.log(err);
                return;
            }

            var process_schedule = schedule;
            var process_timepunch = mssql_result.recordset;


            var output = [];

            for (i = 0; i < process_schedule.length; i++) {

                process_schedule[i].fullname = process_schedule[i].fullname.replace(" (NTD)", "");
                process_schedule[i].fullname = process_schedule[i].fullname.replace(" (ND)", "");
                process_schedule[i].fullname = process_schedule[i].fullname.replace(" (NT)", "");
                process_schedule[i].fullname = process_schedule[i].fullname.replace(" (Maint)", "");
                process_schedule[i].fullname = process_schedule[i].fullname.replace(" ^^", "");
                process_schedule[i].fullname = process_schedule[i].fullname.replace(" (Jr./NTD)", "");

                for (j = 0; j < process_timepunch.length; j++) {

                    if (process_schedule[i].fullname == (process_timepunch[j].FNAME + " " + process_timepunch[j].LNAME)) {

                        process_schedule[i].punchin = moment(process_timepunch[j].DATETIMESTART, "YYYY-MM-DD HH:mm:ss.SSS").format("X");
                        if (process_timepunch[j].DATETIMEEND) {

                            process_schedule[i].punchout = moment(process_timepunch[j].DATETIMEEND, "YYYY-MM-DD HH:mm:ss.SSS").format("X");

                        } else {

                            process_schedule[i].punchout = null;

                        }

                    }

                }
                output.push(process_schedule[i]);

            }
            resolve(output);


        });

    });

}

function refreshVehicles() {

    return new Promise(function (resolve, reject) {


        try {

            mysql_connection.getConnection(function (err, connection) {

                // Query MySQL database for timepunch entries matching MsSQL results.
                connection.query('SELECT * FROM data_vehicles WHERE number > 0', function (err, mysql_result, fields) {
                    if (err) {
                        connection.release();
                        console.log(err);
                        return;
                    }
                    resolve(mysql_result);


                });

            });


        } catch (e) {
            console.log(e);
        }


    });
}

setInterval(function () {
    refreshSchedule().then(function (result) {
        refreshTimeclock(result).then(function (output) {
            console.log("Schedule: " + moment().format("HH:mm:ss"));
            io.emit('updateSchedule', output);
        });
    });
}, 15000);

setInterval(function () {
    refreshVehicles().then(function (output) {

        console.log("Vehicles: " + moment().format("HH:mm:ss"));
        io.emit('updateVehicles', output);

    });
}, 15000);

io.on('connection', function (socket) {
    console.log('a user connected');
});

Любая помощь приветствуется, даже точка в правильном направлении может помочь в этой точке.

1 Ответ

0 голосов
/ 02 марта 2019

Приведенный выше код был беспорядком, и я много чего исправил в процессе устранения неполадок, но в конце все проблемы продолжались.

В конце концов, настроил сервер Node.js дома.и это не воспроизводило ту же проблему.В конце концов я понял, что проблема была на моем хостинг-провайдере (Dreamhost).С тех пор я переместил компоненты Node.js в DigitalOcean, и он работал нормально в течение нескольких дней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...