Как правильно закрыть соединение NodeJS с MySQL? - PullRequest
0 голосов
/ 31 января 2019

Я программирую сервер NodeJS с помощью Express и MySQL.Предполагается, что этот сервер будет работать только как Rest API, предоставляя данные JSON для мобильного приложения и клиентского приложения Angular.

В настоящее время я подключаюсь к базе данных с помощью модуля mysql npm.Я замечаю увеличение количества потоков каждый раз, когда перезагружаю свое приложение, так как они не закрываются.Причина в том, что я запускаю соединение при первом запуске сервера.Я задаюсь вопросом, является ли мой подход кодирования действительно лучшим или если в свое время соединение будет прервано, если многие люди начнут получать к нему доступ.

В конце я хочу знать, должен ли я быть: 1)Выполнение HTTP-запроса 2) Открытие соединения 3) Извлечение данных 4) Закрытие соединения после получения данных.

Или, если мне следует придерживаться моего подхода: 1) Запуск соединения при запуске службы2) Используя эту ссылку, чтобы сделать все запросы / ответы

Код того, как я делаю это сейчас:

db_config.ts

    import mysql from 'mysql';
import DevTools from '../dev_tools/devtools';

export function connectToDatabase(): any {

    let connection = mysql.createConnection({
        host: 'localhost',
        port: 3306,
        user: 'userapp',
        password: 'app!@#',
        database: 'db_app'
    })

    connection.connect((err) => {
        if (err) {
            DevTools.printIfInDevMode('DATABASE', `  ${err.code} - Error while connecting:  ${err.name} - ${err.message} `)
            return;
        }
        DevTools.printIfInDevMode('DATABASE', `Connected with id ${connection.threadId}`)

        return connection;
    })
}

server_config.ts

    import express from "express";
import DevTools from "../dev_tools/devtools";
const app = express();

//Configuração para receber parâmetros via POST
app.use(express.urlencoded(
    {
        extended: true
    }
));
app.post('/', (req, res) => {
    DevTools.printIfInDevMode('SERVER', 'Chegou aqui')
    res.send(req.body);
})

export default app;

server_start.ts

    // node-typescript/src/entry.ts
import app from './server_config';
import { connectToDatabase } from './db_config';

export default function startServer() {
    app.listen(3000, () => {
        console.log(`[SERVER] Servidor Iniciado `);
        connectToDatabase();

    });
}

app_dev.ts

    import startServer from './config/server_start';
import DevTools from './dev_tools/devtools';

console.log("[SERVER] Starting in developer mode")
DevTools.setDevMode(true);
startServer();

Что происходит в основном:

  1. Я использую npm для запуска app_dev.ts
  2. app_dev.ts заставляет приложение работать в режиме разработчика, что позволяет мне легко выполнять отладку с помощью метода "printIfInDevMode".
  3. Itвызывает метод "startServer", который импортируется из server_start.ts
  4. server_start.ts импортирует переменную приложения из server_config.ts , которая содержит конфигурацию для экспресс-службы.
  5. server_start.ts выполняет метод прослушивания на порту 3000, после чего пытается подключиться к базе данных с помощью метода «connectToDatabase», импортированного из db_config.ts
  6. «connectToDatabase»"Метод просто устанавливает соединение с сервером MySQL, работающим на локальном хосте, и возвращает ошибку, если это не удается сделать.
  7. Если это удается, он выводит ThreadId соединения.

Мне интересно, должен ли я оставить метод «connectToTheDatabase» внутри app.listen (3000) и никогда не закрывать это соединение, или мне следует поместить его в маршруты GET, открывая соединение, когда кто-то обращается к этому маршруту,получение данных и затем закрытие соединения.

1 Ответ

0 голосов
/ 31 января 2019

На странице / документации mysql npm

Закрытие соединения выполняется с помощью end (), который обеспечивает выполнение всех оставшихся запросов перед отправкой завершающего пакета на сервер mysql.

Таким образом, вы, скорее всего, сделаете что-то вроде connection.end() для достижения того, чего хотите, то есть если предположить, что открытые соединения действительно являются проблемой.В таких ситуациях было бы полезно поделиться небольшим количеством вашего кода.

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