#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. вы используете генераторы?? похоже, это ошибка оттуда.