我从node.js服务器获取数据时遇到问题.
客户端是:
public getTestLines() : Observable{ let headers = new Headers({ 'Access-Control-Allow-Origin': '*' }); let options = new RequestOptions({ headers: headers }); return this.http.get('http://localhost:3003/get_testlines', options) .map((res:Response) => res.json()) .catch((error:any) => Observable.throw(error.json().error || 'Server error')); }
在服务器端我也设置了标题:
resp.setHeader('Access-Control-Allow-Origin','*') resp.send(JSON.stringify(results))
但是我收到了一个错误
"XMLHttpRequest无法加载http:// localhost:3003/get_testlines.对预检请求的响应未通过访问控制检查:请求的资源上没有'Access-Control-Allow-Origin'标头.来源' http://因此不允许localhost:3000 '访问."
我该如何解决?当我删除标题时,它表示此标题是必需的.
Access-Control-Allow-Origin
是响应标头,而不是请求标头.
您需要让它出现在响应中,而不是请求中.
您试图将其置于响应中:
resp.setHeader('Access-Control-Allow-Origin','*')
......但它没有奏效.
这可能是因为您没有将其放在对正确请求的响应上.错误消息说:
对预检请求的响应未通过访问控制检查
您已完成某些操作以使请求成为预检.这意味着在浏览器发出您正在尝试的GET请求之前,它正在发出OPTIONS请求.
据推测,这可能是由您服务器上的不同代码处理的,因此该行resp.setHeader('Access-Control-Allow-Origin','*')
未被命中.
导致预检请求的一件事是添加请求标头(除了少量例外).添加Access-Control-Allow-Origin
到请求将触发预检请求,因此尝试解决问题的第一件事是从请求中删除Access-Control-Allow-Origin
.
如果失败,那么您需要设置服务器,以便它可以响应OPTIONS请求以及GET请求.