Angular7: невозможно установить {responseType: 'text'}

Сценарий: после вызова API из Angular7 я вызываю Node (через экспресс) и возвращаю фрагментированные данные типа string - я хочу захватить эти строковые данные и отобразить их как строку

На стороне сервера: из серверной части узла данные отправляются в виде "текста", а не в формате json ... данные отправляются с помощью нескольких операторов res.write ("некоторые строки").

на стороне клиента в Angular: я хочу, чтобы наблюдаемый обработал эти данные ...

  1. когда я не упоминаю никакого responseType [return this.http.get (this.streamURL);] ... я получаю сообщение об ошибке:

SyntaxError: неожиданный токен {в JSON на позиции 12 в JSON.parse ()

ошибка stackBlitz и аналогичная ошибка во время компиляции на ng serve

  1. когда я не упоминаю responseType как текст [return this.http.get (this.streamURL, {responseType: 'text'});] ... я получаю ошибку во время компиляции:

ОШИБКА в src / app / myS.service.ts (24,54): ошибка TS2322: тип «текст» не может быть назначен типу «json»

как я могу захватить "текстовые" данные из моего бэкэнда Node JS ... я использую npm cors в моем узле, поэтому ошибок CORS там нет

Демо-код доступен здесь: https://stackblitz.com/edit/angular-44sess

Моя Серверная часть представлена ​​во фрагменте ниже:

app.get('/obs/responseWrite', cors(), function(req, res){
  var j=0;
  
  const headers = { 
    'Content-Type': 'text',     
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',
    'Access-Control-Max-Age': 2592000, // 30 days
  };
  res.writeHead(200,headers);
  
  for(var i=0; i<50000; i++){
    /* setInterval(function() {    res.write("returning j:["+ j + "]. "); j=j+1; if(j>=100){res.end();} }, 1000); */
    var myObj =  { return : i };
    var myStr= JSON.stringify(myObj);
    console.log(myStr);
    res.write(myStr);
  }
  setInterval(function() {    res.end(); }, 15000);
  
});


person Akber Iqbal    schedule 05.12.2018    source источник
comment
попробуйте это один раз return this.http.get(this.streamURL , { responseType: 'text'}); удалите все.   -  person ashish pal    schedule 05.12.2018


Ответы (2)


В этом случае я всегда использую следующие шаблоны:

returnObservable(): Observable<any> {
  const requestOptions: Object = {
    /* other options here */
    responseType: 'text'
  }
  return this.http.get<any>(this.streamURL , requestOptions);
}

Надеюсь, он ответит на ваш вопрос!

person Ieremias Viorel    schedule 05.12.2018
comment
Я установил responseType, как показано ниже, поскольку он работает. вернуть this.httpClient.get ‹any› (${environment.baseApiUrl}/getResonseAsText, {params: queryParams, headers: headers, responseType: 'text' as 'json'}); Для справки: github.com/angular/angular/issues/18586 - person Dilip Dalwadi; 06.01.2020
comment
@Ieremias Viorel Спасатель жизни! Я использовал это для загрузки в Excel. И отлично сработало. - person Laxminarayan; 20.01.2021

Вы не можете использовать общий тип возврата. В документации общий тип предназначен только для json. Это означает, что вам нужно использовать вот так:

return this.http.get(this.streamURL, { responseType: "text"});

См. Документацию https://angular.io/api/common/http/HttpClient#get Вас интересует Overload # 11, и теперь вы используете Overload # 13

Наконец, это ссылка для вашего кода с обновлением: https://stackblitz.com/edit/angular-gv1tkl?file=src/app/myS.service.ts

ИЗМЕНИТЬ 1

Я вставил неверную ссылку на stackblitz. Правильно выше.

person Łukasz Wojtanowski    schedule 05.12.2018
comment
как я писал выше (пункт 2) ... когда я это делаю, я получаю сообщение об ошибке, и программа не компилируется ... [ОШИБКА в src / app / myS.service.ts (24,54): ошибка TS2322: Тип "текст" нельзя присвоить типу "json"] - person Akber Iqbal; 05.12.2018
comment
@AIqbalRaj проверь мой пример в stackblitz. Я добавляю wep-api и не получаю упомянутой вами ошибки. - person Łukasz Wojtanowski; 05.12.2018
comment
Я получил ошибку и обновил вопрос с ней - в моем локальном angular я также получил ошибку на ng serve - person Akber Iqbal; 05.12.2018
comment
вопрос четко сказал Angular 7, и это дает Нет перегрузки, соответствующей этой ошибке вызова. принятый ответ выше работает нормально. - person Yazan Khalaileh; 23.04.2020