CORS 错误 Angular 2 + Express 节点

Posted

技术标签:

【中文标题】CORS 错误 Angular 2 + Express 节点【英文标题】:CORS error Angular 2 + Express Node 【发布时间】:2018-03-27 06:09:53 【问题描述】:

正面(角度 2)

public googlesearch(ev:Event)
    this.http.get("https://maps.googleapis.com/maps/api/place/autocomplete/json?input="+ev.target.value+"&types=establishment&key=AIzaSyAKdEt_dYbdPY-CFo0zie23E44XxTQc1n7").map(res => $.parseJSON(res)).subscribe( data => 
      this.predictions = data.predictions;
      console.log(this.predictions);
     ,(error) => 
       alert('Not able to get')
       )


      

节点(Express 4.14)

var app = express();
app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
);

但我遇到了 CORS 错误

加载失败 https://maps.googleapis.com/maps/api/place/autocomplete/json?input=loc&types=establishment&key=AIzaSyAKdEt_dYbdPY-CFo0zie23E44XxTQc1n8: 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:3000” 访问。

并且在 npm 控制台上也没有收到任何请求。

【问题讨论】:

【参考方案1】:

有一个 api 可以以更清洁的方式进行 通过脚本标签导入 google map api

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places&callback=initService"
    async defer></script>

现在从自动完成 API 声明一个服务

function initService()
   autoService = new google.maps.places.AutocompleteService();

在你的事件监听器中这样做

autoService.getQueryPredictions( input: event.target.value , displaySuggestions);

关注完整示例https://developers.google.com/maps/documentation/javascript/examples/places-queryprediction

编辑

如果你想从你的 express 应用程序中执行此操作,可以使用 npm

https://www.npmjs.com/package/googleplaces

为什么从 app.js 设置后出现 cors 错误

因为在前端,您使用 maps.google.com 网址调用 http 服务获取方法,所以浏览器绝不会联系您的服务器,它会直接转到 google 服务器尝试检索内容,所以在这种情况下,您在 app.js 中的配置毫无用处,除非您在 Angular 中定义代理。

【讨论】:

如何使用自己不同的服务器服务? 你到底想要什么?你想表达对google api的请求,这样你就可以从角度控制器调用你自己的服务,而这个调用googleApi 我想知道原因,为什么在服务器 app.js 启用 cors 后,我无法得到响应。前端有什么拒绝它的吗?【参考方案2】:

该标头必须由目标 url 服务器设置,https://maps.googleapis.com/ 在您的情况下。在您的服务器上设置标头将无济于事。

你可以,但是-

    找到允许从浏览器调用的适当 api。 在您的服务器上实现该 url 的代理并从浏览器调用它。

【讨论】:

请解释一下。

以上是关于CORS 错误 Angular 2 + Express 节点的主要内容,如果未能解决你的问题,请参考以下文章

带有 Google 的 OAuth2 - CORS 错误(Angular + Spring boot)[重复]

Keycloak Spring boot 后端和 Angular 前端,CORS 错误

Keycloak-angular:访问/帐户失败,出现 403 错误和 CORS 消息

为啥只有 Angular 才会出现 CORS 错误? [复制]

在带有 Angular 的 Spring Boot 中启用了 Cors,但仍然出现 cors 错误

跨域资源共享错误 (CORS) Angular 10