Nestjs:无法使用 jwt Constants.ts 访问 env 文件

问题描述 投票:0回答:1

我有一个项目,我需要实现 JWT 服务。我为此关注了 Nestjs 文档。 在文件constants.ts中,我导出一个对象,该对象具有密钥的秘密和值的process.env

export const jwtConstants = () => ({
  secret: process.env.SECRET_JWT,
});

这是行不通的。 我尝试过直接使用值键并且有效。 我不知道为什么我无法访问此文件中的 env 文件。 这是我的身份验证模块

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { UserService } from '../user/user.service';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from '../user/user.schema';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';

@Module({
  imports: [
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
    JwtModule.register({
      global: true,
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '60s' },
    }),
  ],
  providers: [AuthService, UserService],
  controllers: [AuthController],
})
export class AuthModule {}

我的身份验证服务

import { Injectable } from '@nestjs/common';
import { UserService } from '../user/user.service';
import { AuthDto } from './dto/auth.dto';
import { JwtService } from '@nestjs/jwt';
import * as argon2 from 'argon2';

@Injectable()
export class AuthService {
  constructor(
    private userService: UserService,
    private jwtService: JwtService,
  ) {}

  async signIn(authDto: AuthDto): Promise<{ access_token: string }> {
    const user = await this.userService.findOne(authDto.email);
    try {
      if (await argon2.verify(user.password, authDto.password)) {
        const payload = {
          userName: user.firstName,
          userLastName: user.lastName,
          userPhone: user.phone,
          userEmail: user.email,
        };
        return {
          access_token: await this.jwtService.signAsync(payload),
        };
      } else {
        console.log('doesn\t match');
      }
    } catch (error: any) {
      console.log('doesn\t work');
    }
  }
}

和我的应用程序模块与 ConfigModule.forRoot

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { ConfigModule } from '@nestjs/config';
import { UserModule } from './user/user.module';
import { CompanyModule } from './company/company.module';
import { CallForBidsModule } from './callForBids/call-for-bids.module';
import { AuthModule } from './auth/auth.module';
import { User, UserSchema } from './user/user.schema';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env',
    }),
    MongooseModule.forRoot(process.env.MONGO_DB_URL, {
      dbName: process.env.MONGO_DB_DATABASE_NAME,
      auth: {
        username: process.env.MONGO_DB_USERNAME,
        password: process.env.MONGO_DB_PASSWORD,
      },
    }),
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
    // feature module
    UserModule,
    CompanyModule,
    CallForBidsModule,
    AuthModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

我尝试更改 lib 并为 Nestjs 添加 dotenv lib,但结果相同 我有 tryc 和直接可以工作的密钥,但我需要使用 .envfile 重新构建项目也不起作用

jwt nestjs
1个回答
0
投票

使用当前的

jwtConstants
,您应该像
jwtConstants().secret
一样访问秘密,因为它是函数导出。

但是,当您使用

@nestjs/config
时,更好的方法是使用
JwtModule.registerAsync
并将
ConfigService
注入
JwtModule
而不是依赖于
process.env
,因此请确保值来自哪里你认为他们是。这看起来像

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { UserService } from '../user/user.service';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from '../user/user.schema';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';

@Module({
  imports: [
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
    JwtModule.registerAsync(
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        global: true,
        secret: config.get('SECRET_JWT'),
        signOptions: { expiresIn: '60s' },
      }),
    }),
  ],
  providers: [AuthService, UserService],
  controllers: [AuthController],
})
export class AuthModule {}

您还可以对

MongooseModule
执行类似的方法,使用
forRootAsync
注入
ConfigService
并从那里获取环境变量

© www.soinside.com 2019 - 2024. All rights reserved.