Angular HttpClient получает текст, а не json - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь отключить автоматический синтаксический анализ ответа в json для моего get запроса в моем HttpClient после API . Однако каждый раз, когда я устанавливаю

return this.http.get(requestURL, {
  responseType: 'text'
}).pipe(
  map((response: Response) => {
    console.log(response);
  })
);

, мой терминал VSCode вспыхивает pipe, включая скобку красным цветом, и я получаю

error TS2345: Argument of type 'OperatorFunction<Response, void>' is not assignable to parameter of type 'OperatorFunction<string, void>'

??? Слежу за документацией. Я использую неправильную версию?

------ РЕДАКТИРОВАТЬ ------

После предложения ниже я получаю это

map((response: Response) => {
    return this.parseData(response.text());
})

error TS2345: Argument of type 'Promise<string>' is not assignable to parameter of type 'string'.

[ng] Тип «Ответ» не может быть присвоен типу «строка». Вы забыли использовать 'await'?

Где parseData принимает строку в качестве ввода.

1 Ответ

4 голосов
/ 21 июня 2020

Проблема в том, что вы ничего не возвращаете от оператора Rx JS map . Как минимум, вам нужно будет вернуть response:

return this.http.get(requestURL, {
  responseType: 'text'
}).pipe(
  map((response: Response) => {
    console.log(response);
    return response;
  })
);

Это будет похоже на Array.prototype.map и ничего не будет возвращать, у вас, вероятно, будет какая-то ошибка компиляции с точки зрения TypeScript.

На самом деле, map здесь совсем не нужен, поскольку он используется для преобразования / проецирования / отображения генерируемых значений. Если вы пытаетесь выполнить побочные операции, такие как console.log(), вы должны использовать вместо этого оператор tap :

return this.http.get(requestURL, {
  responseType: 'text'
}).pipe(
  tap((response) => {
    console.log(response);
  })
);

Update: It звучит так, будто вы получаете новую ошибку, касающуюся попытки передать Promise<string> функции, которая ожидает только string. Это исходит от response.text(). Если вам абсолютно необходимо выполнить метод text(), вы можете использовать такой оператор, как switchMap , чтобы выполнить обещание:

return this.http.get(requestURL, {
  responseType: 'text'
}).pipe(
  switchMap((response) => response.text()),
  map((text) => this.parseData(text))
);

Надеюсь, это поможет!

...