Я хочу получить данные Пользователь с моего сервера JSON, вот их данные:
{
"users": [
{
"id": 1,
"username": "test",
"password": "test",
"role": "admin",
"token":"yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw"
}
]
}
Для этого я использовал запрос на получение, вот мой код:
@Injectable()
export class FakeBackendInterceptor implements HttpInterceptor,OnInit {
constructor(private authService: AuthService, private userData: Http) { }
private endpoint: string = 'http://localhost:3000/users';
users: Array<any> = [];
ngOnInit(){
this.authService.getUsers()
.toPromise()
.then((users: Array<User>) => {
this.users = users;
return users;
});
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// const users: User[] = [
// { id: 1, username: 'test', password: 'test', role: "user" }
// ];
const authHeader = request.headers.get('Authorization');
const isLoggedIn = authHeader && authHeader.startsWith('Bearer fake-jwt-token');
// wrap in delayed observable to simulate server api call
return of(null).pipe(mergeMap(() => {
// authenticate - public
if (request.url.endsWith('3000/users') && request.method === 'PUT') {
console.info(this.users);
const user = this.users.find(x => x.username === request.body.username && x.password === request.body.password);
if (!user) return error('Username or password is incorrect');
return ok({
id: user.id,
username: user.username,
role: user.role,
token: user.token
});
}
// get all users
if (request.url.endsWith('/users') && request.method === 'GET') {
if (!isLoggedIn) return unauthorised();
return ok(this.users);
}
// pass through any requests not handled above
return next.handle(request);
}))
.pipe(materialize())
.pipe(delay(500))
.pipe(dematerialize());
// private helper functions
function ok(body) {
return of(new HttpResponse({ status: 200, body }));
}
function unauthorised() {
return throwError({ status: 401, error: { message: 'Unauthorised' } });
}
function error(message) {
return throwError({ status: 400, error: { message } });
}
}
}
export let fakeBackendProvider = {
// use fake backend in place of Http service for backend-less development
provide: HTTP_INTERCEPTORS,
useClass: FakeBackendInterceptor,
multi: true
};
Я изменил свою логику и попытался использовать Promises вместо Observable, но в этом случае я получил пустой массив (кажется, что я не могу разобрать полученный ответ как User [], вместо этого я получил Promise>) и не могу получить Массив пользователей, что я должен изменить, чтобы проанализировать запрос на получение ответа на массив User []?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем основном компоненте, где вы собираетесь использовать данные, на которые вам нужно подписаться, как на Observable. поэтому попробуйте следующее.
public users = [];
this.exampleService.getUsers().subscribe(data => {
console.info(data); // should be your users.
this.users = data.users;
}, error => {
console.info(error); // if api returns and error you will get it here
});
С вашим редактированием
Я бы по-прежнему придерживался Observable, но это зависит от предпочтений. Пока this.authService.getUsers() возвращает Observable<IUsers>, это должно работать нормально. Также рекомендовал бы создать интерфейс для обработки данных.
export interface IUsers
{
id: number;
username: string;
password: string;
role: string;
token: string;
}
public users: IUsers[] = [];
public ngOnInit(): void {
this.authService.getUsers().subscribe(data => {
console.info(data); // should be your users.
this.users = data.users;
}, error => {
console.info(error); // if api returns and error you will get it here
});
});
}
Затем это должно дать вам this.users для использования в перехватчике. Если это не поможет, добавьте код для this.authService.getUsers()
Надеюсь, это поможет, прокомментируйте, если у вас возникнут какие-либо проблемы.
добавлена надежда на редактирование, которая поможет, можете ли вы подтвердить для меня, поскольку я не уверен в своей голове, срабатывает ли console.info() данных в подписке до запуска перехватчика.
Эй, спасибо за ваш ответ, я думаю, что мне не следовало использовать подписку, поэтому я изменил свою логику, но теперь у меня новая проблема, я думаю, я не могу проанализировать свой ответ на этот массив Пользователь [], у вас есть есть идеи, как мне изменить свою логику/код, чтобы получить нормальный ответ?