Nestjs не получает услугу передачи данных контроллеру

#nestjs

Вопрос:

Я ищу ответ от службы поддержки пользователей .. но он возвращает нулевое значение.. Я утешил данные в userSerice, которые они показывают здесь.

возможно, мой контроллер дает ответ перед получением значения от службы пользователей.

как я могу это решить?

пользовательский контроллер

 import {
  Controller,
  Post,
  Body,
  Get,
  Param,
  Patch,
  Delete,
} from '@nestjs/common';

import { UserService } from './user.service';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}


  @Post('/login')
  async login(
    @Body('email') userEmail,
    @Body('password') userPassword
  ) {
    const token = await this.userService.Login(userEmail, userPassword)
    console.log(token, 'token')
    return token;
  }
}
 

Обслуживание пользователей :

 import { Injectable, NotFoundException, UnauthorizedException } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import * as jwt from 'jsonwebtoken';


import { Model } from 'mongoose';

import { User } from './user.model';

import * as bcrypt from 'bcrypt'
import { resolve } from 'dns';

@Injectable()
export class UserService {
  constructor(
    @InjectModel('User') private readonly userModel: Model<User>,
  ) { }

  async Login(email: string, password: string) {
    const user = await this.userModel.findOne({ email });
    if (!user) {
      console.log("User does exist on the database.");
      throw new UnauthorizedException();
    }

      bcrypt.compare(password, user.password, function (err, result) {
        if (!result) {
          throw new UnauthorizedException();
        }
        const authJwtToken = jwt.sign({ name: user.name, email: user.email, role: user.role }, "testSecreate");
        const response = { name: user.name, email: user.email, role: user.role, token: authJwtToken }
        console.log(response)
        return response;
      });
  }
}
 

Комментарии:

1. bcrypt.compare и другие функции jwt должны вызываться с помощью await.

2. это показывает ошибку.. когда я добавляю ожидание перед jwt.sign const authJwtToken = ожидание jwt.sign({ имя: user.name, электронная почта: пользователь.электронная почта, роль: пользователь.роль }, «testSecreate»);

3. и что это такое?

4. пожалуйста, ознакомьтесь с комментарием в ответе

5. /медиа/раббани/_dde_data1/nestjs/контакт-продукт-аутентификация/dist/аутентификация/пользователь.сервис.js:57 [0] const authJwtToken = выход jwt.знак({ имя: user.name, электронная почта: пользователь.электронная почта, роль: пользователь.роль }, «testSecreate»); [0] ^^^^^ [0] [0] Синтаксическая ошибка: Неожиданное зарезервированное слово в строгом режиме [0] в модуле._компиляция (внутренний/модули/cjs/загрузчик.js:895:18) [0] в объекте. Module._extensions..js (внутренние/модули/cjs/загрузчик.js:995:10)

Ответ №1:

У Тушара есть правильный ответ, но он все еще смешивает обещания и обратные вызовы, которых, я думаю, следует избегать, если это возможно. Вы можете использовать это вместо того, чтобы не иметь никаких обратных вызовов, а просто использовать async/await и обещать во всем методе

 import {
  Injectable,
  NotFoundException,
  UnauthorizedException,
} from "@nestjs/common";
import { InjectModel } from "@nestjs/mongoose";
import * as jwt from "jsonwebtoken";

import { Model } from "mongoose";

import { User } from "./user.model";

import * as bcrypt from "bcrypt";

@Injectable()
export class UserService {
  constructor(@InjectModel("User") private readonly userModel: Model<User>) {}

  async Login(email: string, password: string) {
    const user = await this.userModel.findOne({ email });
    if (!user) {
      console.log("User does exist on the database.");
      throw new UnauthorizedException();
    }

    const result = await bcrypt.compare(password, user.password);
    if (!result) {
      throw new UnauthorizedException();
    }
    const authJwtToken = await jwt.sign(
      { name: user.name, email: user.email, role: user.role },
      "testSecreate"
    );
    const response = {
      name: user.name,
      email: user.email,
      role: user.role,
      token: authJwtToken,
    };
    console.log(response);
    return response;
  }
}
 

Теперь console.log(response) console.log('token', token) в вашем методе контроллера будет срабатывать раньше, и поток будет выглядеть синхронно, в то время как на самом деле он асинхронен по своей природе.

Ответ №2:

 import { Injectable, NotFoundException, UnauthorizedException } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import * as jwt from 'jsonwebtoken';


import { Model } from 'mongoose';

import { User } from './user.model';

import * as bcrypt from 'bcrypt'
import { resolve } from 'dns';

@Injectable()
export class UserService {
  constructor(
    @InjectModel('User') private readonly userModel: Model<User>,
  ) { }

  async Login(email: string, password: string) {
    const user = await this.userModel.findOne({ email });
    if (!user) {
      console.log("User does exist on the database.");
      throw new UnauthorizedException();
    }

     await bcrypt.compare(password, user.password, function (err, result) {
        if (!result) {
          throw new UnauthorizedException();
        }
        const authJwtToken = await jwt.sign({ name: user.name, email: user.email, role: user.role }, "testSecreate");
        const response = { name: user.name, email: user.email, role: user.role, token: authJwtToken }
        console.log(response)
        return response;
      });
  }
} 
 

записка
Асинхронный метод будет выполняться параллельно с вашей основной программой, поэтому ваша консоль.журнал будет выполнен до того, как внутри появится функция обратного bcrypt.compare вызова . Вы всегда будете видеть: «Ой, это было ложью».

Комментарии:

1. /медиа/раббани/_dde_data1/nestjs/контакт-продукт-аутентификация/dist/аутентификация/пользователь.сервис.js:57 [0] const authJwtToken = выход jwt.знак({ имя: user.name, электронная почта: пользователь.электронная почта, роль: пользователь.роль }, «testSecreate»); [0] ^^^^^ [0] [0] Синтаксическая ошибка: Неожиданное зарезервированное слово в строгом режиме

2. вы используете генераторы?? похоже, это ошибка оттуда.