用于 $http.get() 调用的 Node Express Cross Origin

Posted

技术标签:

【中文标题】用于 $http.get() 调用的 Node Express Cross Origin【英文标题】:Node Express Cross Origin for $http.get() calling 【发布时间】:2016-11-18 06:21:23 【问题描述】:

我做了一个简单的节点服务器,我需要它作为 $http.get() 调用的 Cross Origin,所以我将所需的标头添加到 app.use 作为 this 答案中的详细信息。最后服务器代码是 -

var express = require('express');
var app = express();

var port = process.env.PORT || 3000;

app.use(express.static('.'));

app.all('/', function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
 );

app.listen(port);
console.log('server runs on port: ' + port); 

在我的 index.html 中,有角度的 $http.get() 调用另一个来源 -

$http.get('http://itunes.apple.com/search', 
    term: 'johnson'
);

但是这个调用仍然被浏览器拒绝并返回错误 -

 XMLHttpRequest cannot load https://itunes.apple.com/search. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

我怎样才能正确地从index.html 进行跨域$http.get 调用?

【问题讨论】:

为什么你在自己的网络服务器上允许 CORS 并等待它在 Apple 服务器上被允许? 我是 node 新手,如果你有的话请给我一个解决方案.. 简短回答:当服务器上不允许 CORS 时,不可能从您的网页发出跨域请求。由于您无法控制iTunes,因此您无法做到 【参考方案1】:

您实际上并不了解跨域资源共享的工作原理。跨域请求应该在您发出请求的服务器上允许,而不是在您为页面提供服务的服务器上。

所以,答案是如果他们不允许你这样做,你就不能向苹果网站提出请求。

附:您已允许其他网站通过将此代码添加到您的快速应用程序来向您的网站发出请求:

  app.all('/', function(req, res, next) 
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();

【讨论】:

那么我如何调用$http.get('http://itunes.apple.com/search', ...) 并取回响应 JSON 呢? 你不能这样做。 你不能从你网页的javascript发出这样的请求。 从节点的js文件中可以吗? 如果你真的想解决这个问题,你应该向你的网络服务器添加一个函数,它会从 nodejs 向这个页面发出请求,然后从你网页的 javascript 调用它

以上是关于用于 $http.get() 调用的 Node Express Cross Origin的主要内容,如果未能解决你的问题,请参考以下文章

node.js http.get 在向远程站点发出 5 次请求后挂起

node.js 调用第三方服务

使用来自 node.js 的凭据反向代理登录

按顺序发出请求 Node.js

GitHub 使用 node.js 发布资产下载

Node.js HTTP Get 流在 docker 容器内冻结