【问题标题】:Nestjs server doesn't respondNestjs服务器没有响应
【发布时间】:2022-02-21 16:19:11
【问题描述】:

我面临一个问题,即在处理数据后,nestjs 服务器没有响应或向客户端发送响应。我创建了一个端点,它需要时间来处理数据并将其插入数据库。我知道这不是一个好的做法,但这几天需要。 如果请求在 4m 18s 内完成,服务器会响应,但再过几秒钟,它就不会响应。没有超时或任何类型的错误被抛出。我尝试从邮递员发送请求,但服务器和邮递员都没有超时。如果我遗漏了任何东西,我也尝试过 try-catch。我正在通过 pm2 部署嵌套服务器。所以我尝试在没有 pm2 的情况下运行服务器,但结果相同。但是,如果它是本地主机,在我的本地环境和服务器上,服务器也会响应。

我对这个错误和任何问题都不知所措。以下是我正在运行的设置:

  • Azure 虚拟机 - B4ms(16GB RAM,4 个 vCPU)
  • Ubuntu 20.04
  • Nodejs (14.18.2)
  • Nestjs (7.0)
  • pm2 (5.1.2)

下面是我的 main.ts 文件


import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { urlencoded, json } from 'express';

async function bootstrap() {

    const app = await NestFactory.create(AppModule, {
        logger: ['log', 'error', 'verbose']
    });
    //   app.setGlobalPrefix('api');
    app.use(json({ limit: '500mb' }));
    app.use(urlencoded({ extended: true, limit: '500mb' }));

    await app.listen(3000);
}
bootstrap();

以下是端点控制器所属的入职模块:

import { Module } from '@nestjs/common';
import { BatchService } from 'src/batch/batch.service';
import { USERS, OFFICES, USER_BATCH, BATCH, SCHEME, USER_OFFICE, DISTRICTS, ONBOARDED_BATCH_DETAILS } from '../core/constants/index';
import { UtilsService } from 'src/core/utils/utils.service';
import scheme from '../models/scheme';
import { SchemesService } from '../schemes/schemes.service';
import batch from '../models/batch';
import offices from '../models/offices';
import users from '../models/user.entity';
import user_batch from '../models/user_batch';
import { OfficeService } from '../office/office.service';
import { UserBatchService } from '../user-batch/user-batch.service';
import { UsersService } from '../users/users.service';
import { OnboardingController } from './onboarding.controller';
import { OnboardingService } from './onboarding.service';
import { UserOfficeService } from '../user-office/user-office.service';
import user_office from '../models/user_office';
import { HttpModule } from '@nestjs/axios';
import { DistrictService } from '../district/district.service';
import district from '../models/district';
import { OnboardedBatchDetailsService } from '../onboarded-batch-details/onboarded-batch-details.service';
import { onboarded_batch_details } from '../models/onboarded_batch_details';

@Module({
    imports: [
        HttpModule
    ],
  controllers: [OnboardingController],
  providers: [
      OnboardingService,
      UsersService,
      { provide: USERS, useValue: users },
      OfficeService,
      { provide: OFFICES, useValue: offices },
      UtilsService,
      UserBatchService,
      { provide: USER_BATCH, useValue: user_batch },
      BatchService,
      { provide: BATCH, useValue: batch },
      SchemesService,
      { provide: SCHEME, useValue: scheme},
      UserOfficeService,
      { provide: USER_OFFICE, useValue: user_office },
      DistrictService,
      { provide: DISTRICTS, useValue: district },
      OnboardedBatchDetailsService,
      { provide: ONBOARDED_BATCH_DETAILS, useValue: onboarded_batch_details }
    ]
})
export class OnboardingModule {}


下面是我的端点代码。

@Post('/test-batch-onboard')
    @HttpCode(200)
    async testBatchOnbard(
        @Headers('apiKey') apiKey,
        @Body() data: Array<BatchData>,
    ){
        return new Promise((resolve, reject) => {
            let t = 259000;  // 4m 19s -- no response

            let d = this.addBatchStudentData(apiKey, data);

            try{
                setTimeout(function () {
                    resolve("I'm done here after \n" + t/60000 + " mins.");
                }, t);
            }
            catch(e){
                console.log(e);
                reject(new InternalServerErrorException());
            }
        })
    }

这是我的 app.module.ts


import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config/dist/config.module';
import { ScheduleModule } from '@nestjs/schedule';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AttendanceController } from './attendance/attendance.controller';
import { DatabaseModule } from './core/database/database.module';
import { AttendanceService } from './attendance/attendance.service';
import { AttendanceModule } from './attendance/attendance.module';
import { UsersModule } from './users/users.module';
import UserAttendance from './models/user_attendance';
import { BATCH, DISTRICTS, OFFICES, ONBOARDED_BATCH_DETAILS, ORGANIZATIONS, USERS, USER_ATTENDANCE, USER_BATCH } from './core/constants';
import { SchedulerModule } from './scheduler/scheduler.module';
import { ReportsModule } from './reports/reports.module';
import { OfficeModule } from './office/office.module';
import { OrganizationModule } from './organization/organization.module';
import { DailyAttendanceTasksService } from './jobs/dailyAttendanceReport.job';
import { UsersService } from './users/users.service';
import { OfficeService } from './office/office.service';
import { OrganizationService } from './organization/organization.service';
import { BatchService } from './batch/batch.service';
import { UtilsService } from './core/utils/utils.service';
import { MailgunService } from './core/utils/mailgun.service';
import { UserBatchModule } from './user-batch/user-batch.module';
import { BatchModule } from './batch/batch.module';
import { OnboardingModule } from './onboarding/onboarding.module';
import { SchemesModule } from './schemes/schemes.module';
import { UserOfficeModule } from './user-office/user-office.module';
import { DistrictService } from './district/district.service';
import { OnboardedBatchDetailsService } from './onboarded-batch-details/onboarded-batch-details.service';
import users from './models/user.entity';
import offices from './models/offices';
import organizations from './models/organizations';
import user_attendance from './models/user_attendance';
import batch from './models/batch';
import district from './models/district';
import { onboarded_batch_details } from './models/onboarded_batch_details';
import { SendBatchDataEmailJobService } from './scheduler/send-batch-data-email-job.service';


@Module({
    imports: [
        ConfigModule.forRoot({ isGlobal: true }),
        ScheduleModule.forRoot(),
        UsersModule,
        AttendanceModule,
        DatabaseModule,
        SchedulerModule,
        ReportsModule,
        OfficeModule,
        OrganizationModule,
        UserBatchModule,
        BatchModule,
        OnboardingModule,
        SchemesModule,
        UserOfficeModule,
    ],
    controllers: [AppController],
    providers: [
        AppService,
        UsersService,
        { provide: USERS, useValue: users},
        OfficeService,
        { provide: OFFICES, useValue: offices },
        OrganizationService,
        { provide: ORGANIZATIONS, useValue: organizations },
        AttendanceService,
        { provide: USER_ATTENDANCE, useValue: user_attendance },
        UsersService,
        { provide: USER_BATCH, useValue: USER_BATCH },
        BatchService,
        { provide: BATCH, useValue: batch },
        DistrictService,
        { provide: DISTRICTS, useValue: district },
        OnboardedBatchDetailsService,
        { provide: ONBOARDED_BATCH_DETAILS, useValue: onboarded_batch_details },
        DailyAttendanceTasksService,
        UtilsService,
        MailgunService,
        DistrictService,
        OnboardedBatchDetailsService
    ],
})
export class AppModule { }


上面的代码在我的本地环境和服务器的本地主机中工作。如果您尝试在服务器上本地发送 curl 发布请求,它会返回响应,但对于任何其他请求,它根本不响应。我尝试使用this 增加nestjs 超时,但没有效果。自 2 天以来,我一直在寻找此问题的解决方案,但找不到。非常感谢任何帮助。谢谢。

编辑

以上代码在AWS EC2实例上正常运行并返回响应。

【问题讨论】:

  • 请展示您的 AppModule

标签: node.js amazon-ec2 timeout nestjs azure-vm


【解决方案1】:

阅读问题说明,Azure 似乎正在中断连接以获得更大的有效负载和冗长的请求。 调整 Azure VM 的 MTU(最大传输单元)和 LSO(大发送卸载)参数可以帮助暂时规避此问题,但最终需要修复设计。

【讨论】:

    【解决方案2】:

    我通过增加虚拟机的默认超时解决了这个问题。可以通过 Azure Powershell 访问更改或增加超时所需的设置。遗憾的是,此设置在 Azure 门户中不可用。我使用Azure powershell version 7.2,更改超时的命令如下:

    1. $publicIP = Get-AzPublicIpAddress -Name '&lt;name_of_the_ip_address_associated_with_your_VM&gt;'
    2. $publicIP.IdleTimeoutInMinutes = "&lt;your_time_in_mins&gt;"
    3. Set-AzPublicIpAddress -PublicIpAddress $publicIP

    ** 请检查命令的语法是否正确,因为不同版本的 powershell 有不同的语法。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2014-06-04
      • 2011-08-22
      • 2017-01-09
      • 2017-01-04
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多