我遇到了一个严重的问题。NestJS在几次请求后就停止工作了。我使用Postman来进行一个特定的API调用,然后,在对同一个路由的请求少于10次后,它变得非常慢,而且每次我都从Postman那里得到超时。
主要.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();
出现问题的控制器:
// 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 raw到运行在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'])
}
}
1条答案
按热度按时间zour9fqk1#
我猜你的问题来自于你使用数据库连接的方式。你创建了大约6或10个到数据库的连接,但你没有释放它们,而mariadb的连接池的默认限制是10(我猜)。
最后,新的请求想创建新的连接,但它达到了限制,新的请求等待另一个连接被释放,但它永远等待下去。
在这种情况下,你可以延长限制(不是根本原因,但我认为知道是很好的)。
将
connectionLimit
添加到ormconfig.json
中的extra
下(或创建数据库配置的位置)更多信息
在查询完成后(成功或错误),您必须立即释放刚刚在
getData
函数中创建的新连接:注意:让我们注意一下查询何时抛出错误,您可以使用try/catch/finally