Не могу преобразовать Observable в Object[]

Я хочу получить данные Пользователь с моего сервера 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 []?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
4 222
1

Ответы 1

В вашем основном компоненте, где вы собираетесь использовать данные, на которые вам нужно подписаться, как на 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() Надеюсь, это поможет, прокомментируйте, если у вас возникнут какие-либо проблемы.

Эй, спасибо за ваш ответ, я думаю, что мне не следовало использовать подписку, поэтому я изменил свою логику, но теперь у меня новая проблема, я думаю, я не могу проанализировать свой ответ на этот массив Пользователь [], у вас есть есть идеи, как мне изменить свою логику/код, чтобы получить нормальный ответ?

samurai samurai 01.03.2019 07:49

добавлена ​​надежда на редактирование, которая поможет, можете ли вы подтвердить для меня, поскольку я не уверен в своей голове, срабатывает ли console.info() данных в подписке до запуска перехватчика.

Dince12 01.03.2019 08:45

Другие вопросы по теме