NestJs:SCRAM-SERVER-FIRST-MESSAGE:客户端密码必须是字符串

我在使用 typeorm 和 postgres 连接到 nest.js 中的数据库时遇到问题。

我在根项目目录中创建了一个.env文件,内容如下

POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_DATABASE=db-name

app.module.ts 中,我编写了以下代码:

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { FeedModule } from './feed/feed.module';

  @Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.POSTGRES_HOST,
      port: parseInt(<string>process.env.POSTGRES_PORT),
      username: process.env.POSTGRES_USER,
      password: process.env.POSTGRES_PASSWORD,
      database: process.env.POSTGRES_DATABASE,
      autoLoadEntities: true,
      synchronize: true,
    }),
    FeedModule,
  ],

})
export class AppModule {}

但是当我通过 npm start 运行应用程序时,它会抛出这个错误: new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')

我错过了什么或做错了什么?

stack overflow NestJs: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string
原文答案
author avatar

接受的答案

这就是我解决这个问题的方式:

import { ConfigModule, ConfigService } from '@nestjs/config';
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersModule } from './users/users.module';
import { config } from 'ormconfig';

@Module({
  imports: [
    ConfigModule.forRoot(),
    UsersModule,
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: () => ({
        type: 'postgres',
        host: process.env.POSTGRES_HOST,
        port: Number(process.env.POSTGRES_PORT),
        username: process.env.POSTGRES_USER,
        password: process.env.POSTGRES_PASSWORD,
        database: process.env.POSTGRES_DB,
        entities: ['dist/**/*.entity{.ts,.js}'],
        synchronize: true,
      }),
    }),
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

答案:

作者头像

正如 docs 中所解释的,您可以定义一个工厂函数,您可以在其中注入配置服务,从而解析相应的值:

TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: (configService: ConfigService) => ({
    type: 'postgres',
    host: configService.get('POSTGRES_HOST'),
    port: +configService.get<number>('POSTGRES_PORT'),
    username: configService.get('POSTGRES_USER'),
    password: configService.get('POSTGRES_PASSWORD'),
    database: configService.get('POSTGRES_DATABASE'),
    synchronize: true,
    autoLoadEntities: true,
  }),
  inject: [ConfigService],
});
作者头像

我能够通过使用配置模块来解决问题。

只需执行 npm i @nestjs/config 。然后在 TypeOrmModule 上方的导入数组中放入 ConfigModule.forRoot({ isGlobal: true }), 。这允许您的模块从 .env 文件中获取环境变量