Угловая проблема HttpClient в преобразователе

Используя Angular 2 с включенной компиляцией AOT (универсальный Angular), в настраиваемом преобразователе я получаю сообщение об ошибке ..

Не перехвачено (в обещании): ошибка Ошибка: неперехвачено (в обещании): ошибка

Проблема кажется изолированной, когда я возвращаю результат вызова HttpClient (который является простым числом).

Если я отключу рендеринг на стороне сервера, все будет работать правильно. Ниже приведен фрагмент кода.

constructor(private httpClient : HttpClient)
{

}

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): number | Observable<number> | Promise<number> {

    try{
        return this.httpClient.get<number>(`/api/something/getnumber`);
    }catch(e){
         console.log(e);              
    }
    return -1;
}

Является ли это фундаментальной проблемой при рендеринге на стороне сервера? Или мне просто не хватает важной конфигурации, которая вам нужна с включенным рендерингом на стороне сервера?


person gmn    schedule 24.10.2017    source источник
comment
Вероятно, это как-то связано с тем, как запрос выполняется на стороне сервера. try..catch здесь бесполезен, потому что функция возвращает наблюдаемый результат, а не результат. Используйте .catch (), чтобы поймать ошибку наблюдаемого или чего-то еще.   -  person Estus Flask    schedule 24.10.2017
comment
При вызове на стороне сервера URL-адреса должны быть абсолютными   -  person David    schedule 17.11.2017


Ответы (2)


Это связано с тем, что в результате вы получаете данные, отличные от json. Добавьте {responseType: 'text'} к вашему вызову, чтобы указать это.

return this.httpClient.get<number>(`/api/something/getnumber`, {responseType: 'text'});

См. Также документацию Запрос данных, отличных от JSON

Не все API возвращают данные JSON. Предположим, вы хотите прочитать текстовый файл на сервере. Вы должны сообщить HttpClient, что ожидаете текстового ответа:

person Igor    schedule 24.10.2017
comment
Я не уверен, что синтаксис responseType здесь правильный, но похоже, что переключение его на возврат объекта устранило ошибку. Я все еще немного смущен, почему это не давало мне лучшей ошибки, даже когда я правильно изменил ее на .catch () - person gmn; 24.10.2017
comment
@gmn - это зависит от того, что вы возвращаете. Вы также получите сообщение об ошибке, если вернете null, но использование вышеуказанного решения также исправит эту ошибку. Если изменение вашего ответа на объект устраняет ошибку, тогда оставим ответ как есть и добавим responseType:'text'. Какой из них вы выберете, зависит от вас. - person Igor; 24.10.2017

Попробуйте, как этот код ниже - мой пример:

@Injectable()
export class HomeActionResolve implements Resolve<any> {

    constructor(private http: Http) { }

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        try {
            return this.http.get('assets/json/sample.json');
        } catch (e) {
            console.log(e);
        }
        return -1;
    }
}

export const HomeRoute: Routes = [
    {
        path: '',
        component: HomeComponent,
        resolve: {
            'pagingParams': HomeActionResolve
        }
    }
];
person Chandru    schedule 24.10.2017