如何正确关闭NodeJS与MySQL的连接?

时间:2019-01-31 19:35:36

标签: mysql node.js express

我正在用Express和MySQL编程NodeJS服务器。该服务器仅应使用Rest API,向移动应用程序和Angular前端应用程序提供JSON数据。

我目前正在使用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. 我使用在 app_dev.ts
  2. 上运行的npm
  3. app_dev.ts 使应用程序在开发人员模式下运行,该模式允许 我可以通过“ printIfInDevMode”方法轻松进行调试。
  4. 它调用从中导入的“ startServer”方法 server_start.ts
  5. server_start.ts server_config.ts 导入应用程序变量 包含快递服务的配置。
  6. server_start.ts 在端口3000和之后的端口上执行listen方法 尝试通过“ connectToDatabase”连接到数据库 从 db_config.ts
  7. 导入的方法
  8. “ connectToDatabase”方法只是启动与MySQL的连接 服务器在本地主机上运行,​​如果失败则返回错误 这样做。
  9. 如果成功,它将打印出连接的ThreadId。

我想知道是否应该在app.listen(3000)中保留“ connectToTheDatabase”方法,并且永远不要关闭此连接,还是应该将其放在GET路由中,当有人访问该路由时打开一个连接,检索数据,然后关闭连接。

1 个答案:

答案 0 :(得分:0)

从mysql npm页面/文档中,

  

使用end()结束连接,以确保在将退出数据包发送到mysql服务器之前执行所有剩余的查询。

因此,您可能会执行connection.end()之类的操作来实现所需的功能,即假设开放连接确实是问题所在。 在这种情况下共享一些代码会有所帮助。