Nodejs + mysql2/promise 连接过多

问题描述

我在一个使用 nodejs + MysqL2 的项目中工作,有时我收到错误连接过多

我的连接:

import {createPool,Pool} from 'MysqL2/promise';

export async function connect(): Promise < any > {
  const connection: Pool = await createPool({
    host: 'localhost',port: 3306,user: 'root',password: '',database: 'mendozarq',connectionLimit: 10
  });
  return connection;
}

控制器:

import { Response,Request } from 'express';
import { FieldPacket,Pool } from 'MysqL2/promise';

import { connect } from './../../classes/database';
import { Personal } from './../../models/personal.interface';

export const getAllPersonal = async (req: Request,res: Response) => {
    try {
        const conn: Pool = await connect();

        const [personal]: [any[],FieldPacket[]] = await conn.query('SELECT * FROM personal ORDER BY creadoEn DESC');
        conn.end();

        return res.status(200).json(personal);

    } catch (error) {
        return res.status(400).json({
            error
        });
    }
}

所以,我的问题是我必须使用 createConnection 而不是 createPool 或者我只需要创建我的 conn 的一个实例。

解决方法

您应该只调用一次 createPool,然后每次都从池中选择。

所以,它应该看起来像这样。创建一个常量来存储池。然后在函数中,如果池已经存在,则在不调用 createPool 的情况下返回池。如果它不存在,那么您将调用 createPool 并返回已创建的池。

import {createPool,Pool} from 'mysql2/promise';

const globalPool: Pool | undefined = undefined;

export async function connect(): Promise <Pool> {

  // If the pool was already created,return it instead of creating a new one.
  if(globalPool) {
    return globalPool;
  }

  // If we have gotten this far,the pool doesn't exist,so lets create one.
  globalPool = await createPool({
    host: 'localhost',port: 3306,user: 'root',password: '',database: 'mendozarq',connectionLimit: 10
  });
  return globalPool;
}