Angular7: невозможно установить {responseType: 'text'} - PullRequest
0 голосов
/ 05 декабря 2018

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

На стороне сервера: Из серверной части Node отправляются данные в виде 'text', а не в формате json ... данные отправляются через несколько операторов res.write ('some strings')

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

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

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

the error on stackBlitz and similar error at compile time on ng serve

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

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

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

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

My Back-end находится во фрагменте ниже:

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);
  
});

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

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

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

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

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

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

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

0 голосов
/ 05 декабря 2018

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

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

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

...