javascript - NestJS 在几次请求后停止工作

标签 javascript typescript mariadb nestjs typeorm

我遇到了一个严重的问题。 NestJS 在几次请求后停止工作。我使用 postman 进行特定的 API 调用,然后,在对同一路由发出不到 10 个请求后,它变得非常慢,并且每次 postman 都会超时。


ma​​in.ts:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import {Logger} from '@nestjs/common'
import * as rateLimit from 'express-rate-limit';
import { WrapContentInterceptor } from './dashboard/dashboard.interceptors';
const PORT = 5000
const TAG = 'main'
async function bootstrap() {
  const logger = new Logger(TAG)
  const app = await NestFactory.create(AppModule);
  // app.useGlobalInterceptors(new WrapContentInterceptor())
  app.enableCors()
  await app.listen(PORT);
  app.use(
    rateLimit({
      windowMs: 15 * 60 * 1000, // 15 minutes
      max: 1000, // limit each IP to 100 requests per windowMs
    }),
  );
  logger.log(`listening port::${PORT}`)
}
bootstrap();

我遇到问题的 Controller :

// some regular imports
@Controller('dashboard')
@UseGuards(AuthGuard()) // protecting routes
export class DashboardController {
    constructor(
        private dashboardService:DashboardService,

    ){}
   // other routes

    @Get('/cockpit/general-numbers') // route that i'm getting the issue
    async getNumbersForCockpit(
        @Query('desiredDate',ParseStringToDatePipe) desiredDay?:Date
    ):Promise<GeneralNumbersForCockpit>{
        this.logger.log(`getNumbersForCockpit::${desiredDay.toISOString()}`)
        let installation = await this.dashboardService.getInstallationsOfDay(desiredDay?desiredDay:undefined)
        let averageTicket = await this.dashboardService.getAverageTicketPlanFromInterval(
            desiredDay?getFirstDayOfMonth(desiredDay):undefined,
            desiredDay?desiredDay:undefined
        )
            
        return {
            averageTicket:averageTicket,
            installation:installation.result
        }
    }
}

PS:我又意识到一件事: 这个错误发生在我在服务层使用纯 SQL 原始数据到在 Docker 容器中运行的 MariaDB 数据库的路由中。 以服务层为例: ````
async getData(dateField:Date=new Date()):Promise<SimpleNumericalData>{
    // this.logger.debug(`f::dateField:${dateField}`)
    this.logger.debug(`getData::dateField:${dateField.toISOString()}`)
    const queryRunner = this.connection.createQueryRunner()
    let res = await queryRunner.manager.query(`
        select count(*) as result from my_table
        where my_field ='I'
        and DATE(date_field) = DATE('${dateField.toISOString()}')    
    `)
    //await this.connection.close()
    // this.logger.debug(`Result:${JSON.stringify(res)}`)
    return {
        result:Number(res[0]['result'])
    }
}

最佳答案

我猜您的问题来自于您使用数据库连接的方式。您创建了大约 6 或 10 个到 db 的连接,但是您没有释放它们,并且 mariadb 连接池的默认限制是 10(我猜)。

最后,新请求想要创建新连接,但已达到限制,新请求等待另一个连接被释放,但它永远等待。

在这种情况下,您可以延长限制(不是根本原因,但我认为了解一下是件好事)。

ormconfig.json 中的 extra 下添加 connectionLimit(或创建数据库配置的位置)

{
  ...,
  "extra": { connectionLimit: 10, ... }
}

More information

并且您必须在查询完成(成功或错误)后立即释放刚刚在 getData 函数中创建的新连接:

...
...
await queryRunner.release()

注意:当你的查询抛出错误时,我们可以使用 try/catch/finally

...
    let res = await queryRunner.manager.query(`
        select count(*) as result from my_table
        where my_field ='I'
        and DATE(date_field) = DATE('${dateField.toISOString()}')    
    `).finally(() => queryRunner.release())
...

关于javascript - NestJS 在几次请求后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64433428/

相关文章:

c# - 剑道网格 : filtering on an array object

php - 可以在 BODY 标签之后放置一个隐藏的 DIV 以向搜索引擎显示文本吗?

Angular 2 --alpha 37 如何在构造函数中获取属性?

javascript - 函数名称末尾的 $ 符号表示什么?

javascript - 如何访问 polymer 核心式生产者元素来设置其字段?

javascript - 数组相等/不等

javascript - '港口' aurelia-skeleton-navigation to typescript

ssl - MariaDB 上的 have_ssl 保持禁用状态,无法在 Debian 和 YaSSL 上启用 SSL

python - 将值存储到 mySQL 表时出错

mysql - 将txt或csv文件插入mysql