首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular2 Http设置头部访问-控制-允许-来源和http CORS

Angular2 Http设置头部访问-控制-允许-来源和http CORS
EN

Stack Overflow用户
提问于 2016-08-14 14:44:05
回答 3查看 8.9K关注 0票数 6

我正在使用Angular2 RC5 (核心,http等),并试图连接到一个支持CORS的Node.js服务器。我的应用程序是从Angular-CLI (版本:"1.0.0-beta.11-webpack.2")新生成的。

代码语言:javascript
复制
// src/app/app.component.ts
...
ngOnInit () {
   const headers: Headers = new Headers();
   headers.append('Accept', 'application/json');
   headers.append('Content-Type', 'application/json');
   headers.append('Access-Control-Allow-Origin', '*');

   const options = new RequestOptions({
     headers: headers
   });

   this.http.get('http://localhost:9000/api/v1/users', options)
    .map((res: Response) => res.json())
    .subscribe(users => console.log(users));
}

..。

当应用程序启动时,OnInit钩子被调用,我在控制台中得到一个错误。这是我得到的错误消息。

代码语言:javascript
复制
EXCEPTION: TypeError: Cannot read property 'toString' of null
browser_adapter.js:84EXCEPTION: TypeError: Cannot read property 'toString' of nullBrowserDomAdapter.logError @ browser_adapter.js:84BrowserDomAdapter.logGroup @ browser_adapter.js:94ExceptionHandler.call @ exception_handler.js:65(anonymous function) @ application_ref.js:267ZoneDelegate.invoke @ zone.js:323onInvoke @ ng_zone_impl.js:53ZoneDelegate.invoke @ zone.js:322Zone.run @      zone.js:216(anonymous function) @ zone.js:571ZoneDelegate.invokeTask @ zone.js:356onInvokeTask @ ng_zone_impl.js:44ZoneDelegate.invokeTask @ zone.js:355Zone.runTask @ zone.js:256drainMicroTaskQueue @ zone.js:474
zone.js:461 Unhandled Promise rejection: Cannot read property 'toString' of null ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'toString' of null(…)consoleError @ zone.js:461_loop_1 @ zone.js:490drainMicroTaskQueue @ zone.js:494
zone.js:463 Error: Uncaught (in promise): TypeError: Cannot read property 'toString' of null(…)

如果我完全放弃optionsheader,我从服务器得到CORS错误但响应状态200。(我猜如果我能传递正确的头,它应该可以工作。)

代码语言:javascript
复制
 this.http.get('http://localhost:9000/api/v1/users')
  .map((res: Response) => res.json())
  .subscribe(users => console.log(users)); 

以下是来自控制台的错误

代码语言:javascript
复制
XMLHttpRequest cannot load http://localhost:4000/api/v1/users. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.
browser_adapter.js:93EXCEPTION: Response with status: 0  for URL: null
browser_adapter.js:84EXCEPTION: Response with status: 0  for URL: nullBrowserDomAdapter.logError @         browser_adapter.js:84BrowserDomAdapter.logGroup @    browser_adapter.js:94ExceptionHandler.call @ exception_handler.js:65next @ application_ref.js:348schedulerFn @ async.js:89SafeSubscriber.__tryOrUnsub @ Subscriber.js:225SafeSubscriber.next @ Subscriber.js:174Subscriber._next @ Subscriber.js:124Subscriber.next @ Subscriber.js:88Subject._finalNext @     Subject.js:128Subject._next @ Subject.js:120Subject.next @ Subject.js:77EventEmitter.emit @ async.js:77onHandleError @ ng_zone_impl.js:74ZoneDelegate.handleError @ zone.js:327Zone.runTask @ zone.js:259ZoneTask.invoke @ zone.js:423
Subscriber.js:229Uncaught Response with status: 0  for URL: null

有人能帮帮忙吗?谢谢。

EN

回答 3

Stack Overflow用户

发布于 2016-08-14 15:53:44

我是一个新手,所以请耐心听我说,但就我而言,访问控制-允许-原始头应该由后端Node.js服务器返回。出于安全考虑,服务端CORS默认关闭。使用以下问题来帮助您实现:How to allow CORS?

票数 4
EN

Stack Overflow用户

发布于 2016-08-24 04:20:39

您的问题是由rc5中引入的错误引起的。HttpXHRBackend已修改,可将任何请求的正文转换为字符串。它查看Content-Type头并尝试调用适当的转换方法。

在上面的代码中,您将Content-Type标头设置为application/json,这会导致XHRBackend尝试将其转换为字符串。但是,由于您发出的是GET请求,body为null,因此将抛出此异常。

在您的情况下,只需删除Content-Type头,一切都应该正常工作。

票数 1
EN

Stack Overflow用户

发布于 2016-09-06 19:09:31

这里写的是:

https://github.com/angular/angular/issues/10612

要解决

代码语言:javascript
复制
EXCEPTION: TypeError: Cannot read property 'toString' of null

您需要将body设置为'‘

代码语言:javascript
复制
headers.append('body', '');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38939845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档