Я использую метод отправки для моего входа в Angular 6, я всегда получал Failed to Login, когда я даже давал правильные учетные данные для входа, и когда я отлаживаю свой код, я обнаружил, что его отправляющие заголовки равны нулю, даже если я включил свои заголовки.
Это мой код, когда я отлаживаю, и его показывающий ответ не определен:
case 'json':default:return res$.pipe(map(function (res) { return res.body; }));
Мой файл TS
import { Injectable } from '@angular/core';
import { RequestOptions, Headers, Response } from '@angular/http';
import { map } from 'rxjs/operators';
import { HttpClient, HttpHeaders } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class AuthService {
baseUrl = "http://localhost:3000/api/auth";
userToken: any;
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
};
constructor(private http: HttpClient) {}
login(loginData: any) {
return this.http.post(this.baseUrl, loginData, this.httpOptions)
.pipe(
map((response: Response) => {
const user = response.json();
if (user) {
localStorage.setItem('token', user.token);
this.userToken = user.token;
}
})
)
}
}
Заранее спасибо





HttpClient делает response.json() за вас, поэтому он возвращает только тело ответа. Также вам, вероятно, не нужно устанавливать какие-либо параметры заголовка, по умолчанию это должно быть приложение / json.
login(loginData: any) {
return this.http.post(this.baseUrl, loginData);
}
Должно хватить. Это вернет наблюдаемое, на которое вы можете подписаться.
Итак, в своем компоненте вы можете:
this.authService.login(data).subscribe((user) => {
if (user) {
localStorage.setItem('token', user.token);
}
else {
// What to do when there is no token
// Ideally you would want to throw an error on the server along the
// lines of code 403.
}
});
Если вы все же вернете код состояния, например, 403, вам нужно поймать ошибку, например: https://www.learnrxjs.io/operators/error_handling/catch.html
Да, теперь я вошел в систему в своей консоли, но как назначить это значение токена моему localStorage bcs, его предоставление не может присвоить значение объекта строке ....
Какой тип user.token? Если это объект, вам нужно будет сделать что-то вроде JSON.stringify (user.token) раньше.
Нет, я неправильно прокомментировал .... Теперь это мой код this.authservice.login (this.loginData) .subscribe ((user) => {if (user) localStorage.setItem ('token', user.token); console.info ("Logged In");} ... Его токен предоставляющего свойства не существует для объекта типа
С этим кодом вы всегда будете в console.info авторизоваться, даже если пользователь не определен. console.info (пользователь), пожалуйста.
Я не уверен, что понимаю, что вы имеете в виду. Если вы подписались ((user) => {console.info (user);}); Что в результате?
Я получаю токен в консоли
Тогда у вас нет объекта пользователя с токеном свойства, но ваш сервер возвращает токен напрямую. Я обновил код, чтобы отразить это.
Я получаю это в качестве вывода {токен: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dpbiI6I… zM2fQ.ek Tr_2VSq8sbfxKBeViJcq HXoqZwOlQ с помощью ключа Y9X, пожалуйста, исправьте этот объект, если я ... я не прав
Получение этой ошибки, если я добавил код, который вы редактировали ... Аргумент типа «Объект» не может быть назначен параметру типа «строка».
Вы правы, тогда неправильно поняли ваш последний комментарий. user.token определяется в этом случае.
Нет проблем, но если я использую user.token, его ошибку выдачи, токен свойства не существует для объекта типа
Позвольте нам продолжить обсуждение в чате.
Спасибо за ответ ... Но я не могу понять, так как я новичок в Angular, поэтому вы можете подробно объяснить ... Если возможно, с каким-либо ответом