我正在尝试在Heroku上部署NestJS REST API,但始终会出现以下错误:
main.ts
我的配置非常简单:
在我的await app.listen(process.env.PORT || AppModule.port);
中,我的服务器启动如下:
web: npm run start:prod
我在项目的根目录中添加了一个Procfile,其中包含:
"build": "tsc -p tsconfig.build.json",
"prestart:prod": "rimraf dist && npm run build",
"start:prod": "node dist/main.js",
我的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的环境文件吗?
答案 0 :(得分:1)
作为总结,请小心数据库连接超时,这可能导致如上所述的heroku引导程序全局超时