Heroku上的NestJS始终无法绑定端口

时间:2019-05-12 21:02:56

标签: heroku nestjs

我正在尝试在Heroku上部署NestJS REST API,但始终会出现以下错误:

main.ts

我的配置非常简单:

  1. 在我的await app.listen(process.env.PORT || AppModule.port);中,我的服务器启动如下:

    web: npm run start:prod

  2. 我在项目的根目录中添加了一个Procfile,其中包含:

    "build": "tsc -p tsconfig.build.json", "prestart:prod": "rimraf dist && npm run build", "start:prod": "node dist/main.js",

  3. 我的package.json文件包含以下脚本:

    TypeOrmModule dependencies initialized SharedModule dependencies initialized AppModule dependencies initialized

Heroku上的过程成功建立,并打印出这些令人放心的,令人放心的行:

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

但是随后立即崩溃:

@Module({
  imports: [
    SharedModule,
    TypeOrmModule.forRootAsync({
      imports: [SharedModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        type: 'postgres',
        host: configService.getString('POSTGRES_HOST'),
        port: configService.getNumber('POSTGRES_DB_PORT'),
        username: configService.getString('POSTGRES_USER'),
        password: configService.getString('POSTGRES_PASSWORD'),
        database: configService.getString('POSTGRES_DB'),
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
      } as PostgresConnectionOptions),
    }),
    UserModule,
  ],
  controllers: [
    AppController,
  ],
  providers: [
    AppService,
  ],
})
export class AppModule {
  static port: number;
  static isDev: boolean;

  constructor(configurationService: ConfigService) {
    console.log(process.env.PORT);
    AppModule.port = configurationService.getNumber('PORT');
    AppModule.isDev = configurationService.getBoolean('ISDEV');
  }
}

我在整个应用程序中使用.env配置,但是我删除了所有HOST和PORT变量(和代码引用),所以我不知道可能是导致此错误的原因。 我想念什么吗?

  

编辑   我特此分享我的app.module和main.ts文件:

app.module.ts

import * as dotenv from 'dotenv';
import * as path from 'path';

@Injectable()
export class ConfigService {
  constructor() {
      const filePath = path.resolve('.env');
      dotenv.config({
      path: filePath,
    });
  }

  getNumber(key: string): number | undefined {
    return +process.env[key] as number | undefined;
  }

  getBoolean(key: string): boolean {
    return process.env[key] === 'true';
  }

  getString(key: string): string | undefined {
    return process.env[key];
  }
}

我的configuration.service.ts是一个简单的实用程序,可从.env文件读取:

async function bootstrap() {
  console.log(process.env.PORT);
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  app.useGlobalPipes(new ValidationPipe(), new TimeStampPipe());
  app.use(json({ limit: '5mb' }));

  app.setGlobalPrefix('api/v1');
  await app.listen(process.env.PORT || AppModule.port);
}
bootstrap();

最后是我的main.ts文件:

configuration.service.ts

可能是我的{{1}}正在干扰heroku的环境文件吗?

1 个答案:

答案 0 :(得分:1)

作为总结,请小心数据库连接超时,这可能导致如上所述的heroku引导程序全局超时