Что может вызвать тайм-аут при запуске sequelize в Node.js? - PullRequest
1 голос
/ 29 января 2020

В моем приложении Node.js (v10.15.0) я использую пакет sequelize (v4.44.3) для подключения к удаленному MySQL база данных. Это приложение работает в Docker контейнере. После долгого запуска программы я начал получать тайм-аут по моему запросу REST. Проблема решается только путем перезагрузки самого контейнера Docker. К сожалению, проблема повторяется снова и снова после нескольких дней программы. Что может быть причиной этой проблемы?

MySQL. js:

const Sequelize = require('sequelize');

const Op = Sequelize.Op;
const operatorsAliases = {
    $eq: Op.eq,
    $ne: Op.ne,
    $gte: Op.gte,
    $gt: Op.gt,
    $lte: Op.lte,
    $lt: Op.lt,
    $not: Op.not,
    $in: Op.in,
    $notIn: Op.notIn,
    $is: Op.is,
    $like: Op.like,
    $notLike: Op.notLike,
    $iLike: Op.iLike,
    $notILike: Op.notILike,
    $regexp: Op.regexp,
    $notRegexp: Op.notRegexp,
    $iRegexp: Op.iRegexp,
    $notIRegexp: Op.notIRegexp,
    $between: Op.between,
    $notBetween: Op.notBetween,
    $overlap: Op.overlap,
    $contains: Op.contains,
    $contained: Op.contained,
    $adjacent: Op.adjacent,
    $strictLeft: Op.strictLeft,
    $strictRight: Op.strictRight,
    $noExtendRight: Op.noExtendRight,
    $noExtendLeft: Op.noExtendLeft,
    $and: Op.and,
    $or: Op.or,
    $any: Op.any,
    $all: Op.all,
    $values: Op.values,
    $col: Op.col
};

const sequelize = new Sequelize(
    process.env.MySQL_DATABASE_NAME,
    process.env.MySQL_USER,
    process.env.MySQL_PASSWORD,
    {
        host: process.env.MySQL_HOST,
        port: process.env.MySQL_PORT,
        dialect: 'mysql',
        operatorsAliases: operatorsAliases,
        pool: {
            max: 15,
            min: 5,
            idle: 20000,
            evict: 15000,
            acquire: 30000
        }
    }
);

sequelize.authenticate().then(() => {
    console.log('Connection to remote MySQL database has been established successfully.');
}).catch(err => {
    console.error('Unable to connect to remote MySQL database:', err);
});

module.exports = sequelize;

app. js:

const express = require('express');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const cors = require('cors');
require('dotenv').config();

const locationsRouter = require('./routes/locations');

const app = express();

app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(cookieParser());

app.use('/api/locations', locationsRouter);

module.exports = app;

мест. js:

const express = require('express');
const router = express.Router();
const sequelize = require('../configurations/MySQL');
const Sequelize = require('sequelize');
const passport = require('passport');
require('../configurations/Password')(passport);

router.post('/search_location', passport.authenticate('jwt', {session: false}, null), function(req, res) {
    const token = getToken(req.headers);
    if (token) {
        sequelize.query("SQL_STATEMENT",
        {
            replacements: {
                latitude : parseInt(req.body.latitude),
                longitude: parseInt(req.body.longitude)
            },
            type: Sequelize.QueryTypes.SELECT
        }).then((locations) => {
            res.status(200).send(locations)
        }).catch((error) => {
            console.log(error);
            res.status(500).send(error);
        });
    } else {
        return res.status(401).send({
            status: false,
            description: "Access denied."
        });
    }
});
...