@arseniylebedev

Как правильно закрывать соединение с MySQL в express.js?

app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var mysql = require('mysql');

var indexRouter = require('./routes/index');
var usersLoginRouter = require('./routes/usersLogin');
var checkTokenRouter = require('./routes/checkToken');
var usersRegRouter = require('./routes/usersReg');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'twig');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(function (req, res, next) {
    res.setHeader('Content-Type', 'application/json');

    next();
});

app.use(function (req, res, next) {
    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'loto_users',
        password : 'loto_users',
        database : 'loto_users'
    });

    connection.connect();

    connection.on('error', function (error) {

    });

    res.mysql = connection;

    next();
});

app.use('/', indexRouter);
app.use('/users/login', usersLoginRouter);
app.use('/users/check/token', checkTokenRouter);
app.use('/users/reg', usersRegRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

checkToken.js
var express = require('express');
var router = express.Router();
var crypto = require('crypto');

router.get('/', function(req, res, next) {
    const token = req.query.hasOwnProperty('token') ? req.query['token'] : null;
    
    res.mysql.query('SELECT * FROM user_tokens WHERE token = ?', [token], function (error, results, fields) {
        if (error || results.length === 0) {
            return res.send(JSON.stringify({
                ok: false,
                message: 'Wrong token'
            }));
        }

        const user_token = results[0];

        if (user_token['end_at'] < Math.floor(new Date() / 1000)) {
            res.mysql.query('DELETE FROM user_tokens WHERE token = ?', [token]);

            return res.send(JSON.stringify({
                ok: false,
                message: 'Token expire'
            }));
        }

        res.send(JSON.stringify({
            ok: true,
            user_id: user_token['user_id'],
            end_at: user_token['end_at'],
            message: 'OK'
        }));
    });

});

module.exports = router;



Запросы к базе асинхронные. Как правильно закрывать соединение?
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
@arseniylebedev Автор вопроса
Решил это через pool.query(). Можно через getConnection() но там постоянно нужно release() использовать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
Правильно закрывать его при остановке сервера.
Зачем вы на каждый запрос создаете новое подключение к mysql?
Вы пишете express server как cgi скрипт или php, но в express у вас сервер работает все время - откройте одно соединение при старте и не трогайте его пока процесс не будет остановлен.

Если очень сильно хочется сделать именно так как у вас - ждите в контроллере пока все запросы к базе завершатся, и добавьте еще один middleware который будет закрывать соединение после того как все прочие слои отработали.
Но лучше сделать по нормальному.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы