Angular7: 无法设置 {responseType: 'text'}
Angular7: unable to set {responseType: 'text'}
场景:
在 Angular7 的 API 调用后,我正在调用 Node(通过 express)并 returning 字符串类型的分块数据 - 我想捕获此字符串数据并将其显示为字符串
服务器端:
从节点后端,发送的数据是 'text' 而不是 json...数据是通过多个 res.write('some strings') 语句发送的
客户端在Angular:
我想要一个 observable 来处理这些数据...
- 当我没有提到任何 responseType [return this.http.get(this.streamURL );]...我得到错误:
SyntaxError: Unexpected token { in JSON at position 12
at JSON.parse ()
- 当我没有提到 responseType as 'text [return this.http.get(this.streamURL , { responseType: 'text'});]... 我明白了编译时错误:
ERROR in src/app/myS.service.ts(24,54): error TS2322: Type '"text"' is
not assignable to type '"json"'
如何从我的 Node JS 后端捕获 'text' 数据...我在我的 Node 中使用 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);
});
在这种情况下我总是使用以下模式:
returnObservable(): Observable<any> {
const requestOptions: Object = {
/* other options here */
responseType: 'text'
}
return this.http.get<any>(this.streamURL , requestOptions);
}
希望它能回答您的问题!
您不能使用 return 通用类型。在文档中,通用类型仅适用于 'json'。这意味着您需要像这样使用:
return this.http.get(this.streamURL, { responseType: "text"});
参见文档https://angular.io/api/common/http/HttpClient#get
您对 Overload #11 感兴趣,现在您正在使用 Overload #13
最后,这是 link 您的代码更新:https://stackblitz.com/edit/angular-gv1tkl?file=src/app/myS.service.ts
编辑 1
我向 stackblitz 粘贴了错误的 link。以上正确。
场景: 在 Angular7 的 API 调用后,我正在调用 Node(通过 express)并 returning 字符串类型的分块数据 - 我想捕获此字符串数据并将其显示为字符串
服务器端: 从节点后端,发送的数据是 'text' 而不是 json...数据是通过多个 res.write('some strings') 语句发送的
客户端在Angular: 我想要一个 observable 来处理这些数据...
- 当我没有提到任何 responseType [return this.http.get(this.streamURL );]...我得到错误:
SyntaxError: Unexpected token { in JSON at position 12 at JSON.parse ()
- 当我没有提到 responseType as 'text [return this.http.get(this.streamURL , { responseType: 'text'});]... 我明白了编译时错误:
ERROR in src/app/myS.service.ts(24,54): error TS2322: Type '"text"' is not assignable to type '"json"'
如何从我的 Node JS 后端捕获 'text' 数据...我在我的 Node 中使用 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);
});
在这种情况下我总是使用以下模式:
returnObservable(): Observable<any> {
const requestOptions: Object = {
/* other options here */
responseType: 'text'
}
return this.http.get<any>(this.streamURL , requestOptions);
}
希望它能回答您的问题!
您不能使用 return 通用类型。在文档中,通用类型仅适用于 'json'。这意味着您需要像这样使用:
return this.http.get(this.streamURL, { responseType: "text"});
参见文档https://angular.io/api/common/http/HttpClient#get 您对 Overload #11 感兴趣,现在您正在使用 Overload #13
最后,这是 link 您的代码更新:https://stackblitz.com/edit/angular-gv1tkl?file=src/app/myS.service.ts
编辑 1
我向 stackblitz 粘贴了错误的 link。以上正确。