エラー時の状況
NestJSの環境構築時に起こったエラーの備忘録。
以下の記事を参考にしてNestJSの環境を構築して、yarn start:dev
した時に怒られた。
Error: SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string
お断り
記事の著者を攻める意図は全くありません。
むしろTypeORM 0.3系の情報なのでめちゃくちゃ感謝しています!
エラー原因の仮説
DBにうまく接続できていないのが原因そう。
- DBに接続する
database.module.ts
ファイルに不備がある? -
docker-compose.yaml
の内容が間違っている?-
.env
ファイルの内容が間違っている?
-
仮説を検証してみる
一番簡単に対処できそうな設定ファイルをざっと見てみる。
docker-compose.yaml
の内容が間違っている?
.env
ファイルの内容が間違っている?
タイポはしていなさそう。
.env
POSTGRES_HOST="127.0.0.1"
POSTGRES_PORT="5432"
POSTGRES_DB="postgres"
POSTGRES_USER="root"
POSTGRES_PASSWORD="password"
docker-compose.yaml
version: '3'
services:
db:
image: postgres
volumes:
- ./db/data:/var/lib/postgresql/data
- ./db/postgres/initdb:/docker-entrypoint-initdb.d
ports:
- '${POSTGRES_PORT}:5432'
environment:
- TZ=Asia/Tokyo
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
DBに接続するdatabase.module.ts
ファイルに不備がある?
タイポはなさそうなのでdatabase.module.ts
の内容を見てみる。
うむ、記事と比較しても内容的に問題なさそう???
いや、もしかするとここで.env
ファイルの設定を何かしらする必要がある?
database.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
return {
type: 'postgres',
host: configService.get('POSTGRES_HOST'),
port: configService.get('POSTGRES_PORT'),
database: configService.get('POSTGRES_DB'),
username: configService.get('POSTGRES_USER'),
password: configService.get('POSTGRES_PASSWORD'),
entities: [Todo],
synchronize: true,
};
},
}),
],
})
export class DatabaseModule {}
.env
ファイルの設定が必要なのかググってみる
するとapp.module.ts
に環境変数の設定をしている記事を見つけた。
今回は、database.module.ts
に環境変数の設定を追加しても問題なさそうか試してみる。
database.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { Todo } from 'src/todo/entities/todo.entity';
@Module({
imports: [
+ TypeOrmModule.forRootAsync({
+ imports: [
+ ConfigModule.forRoot({
+ envFilePath: ['.env'],
+ }),
+ ],
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
return {
type: 'postgres',
host: configService.get('POSTGRES_HOST'),
port: configService.get('POSTGRES_PORT'),
database: configService.get('POSTGRES_DB'),
username: configService.get('POSTGRES_USER'),
password: configService.get('POSTGRES_PASSWORD'),
entities: [Todo],
synchronize: true,
};
},
}),
],
})
export class DatabaseModule {}
これでログを見てみると、解消されていました!
🎉🎉🎉
原因
.env
ファイルの読み込みの設定が、app.module.ts
に紐付いていないのが原因でした。
Source and Thanks