2016-11-22 67 views
0

我建立一个应用程序做出反应,我想打个电话给https://itunes.apple.com/search?term=jack+johnson快递+ CORS()无法正常工作

我有一个助手叫requestHelper.js它看起来像:

import 'whatwg-fetch'; 

function parseJSON(response) { 
    return response.json(); 
} 

function checkStatus(response) { 
    if (response.status >= 200 && response.status < 300) { 
    return response; 
    } 

    const error = new Error(response.statusText); 
    error.response = response; 
    throw error; 
} 

export default function request(url, options) { 
    return fetch(url, options) 
    .then(checkStatus) 
    .then(parseJSON); 
} 

所以我得到:

的XMLHttpRequest无法加载 https://itunes.apple.com/search?term=jack%20johnson。否 “访问控制 - 允许来源”标题出现在请求的 资源中。原因'http://localhost:3000'因此不允许 访问。

我Express服务器看起来是这样的:

const ip = require('ip'); 
const cors = require('cors'); 
const path = require('path'); 
const express = require('express'); 
const port = process.env.PORT || 3000; 
const resolve = require('path').resolve; 
const app = express(); 

app.use(cors()); 
app.use('/', express.static(resolve(process.cwd(), 'dist'))); 

app.get('*', function(req, res) { 
    res.sendFile(path.resolve(resolve(process.cwd(), 'dist'), 'index.html')) 
}); 

// Start app 
app.listen(port, (err) => { 
    if (err) { 
    console.error(err.message); 
    return false; 
    } 

    const divider = '\n-----------------------------------'; 
    console.log('Server started ✓'); 
    console.log(`Access URLs:${divider}\n 
    Localhost: http://localhost:${port} 
     LAN: http://${ip.address()}:${port} 
    ${divider} 
    `); 
}); 

我一直在使用mode: 'no-cors'尝试,但实际上不是我所需要的,因为反应是空的。

我在做这个配置有问题吗?

回答

1

在当托管在的代码对B.

的请求在这种情况下是您的快速应用和B是iTunes的同源策略踢。

CORS用于允许B授予对A上代码的读取响应的权限。

您正在A上设置CORS,因为您的网站无法授予您的客户端代码访问其他网站的数据的权限,所以这没什么用。

您需要在B上进行设置。由于您(可能)不适用于Apple,因此您无法执行此操作。只有Apple可以授予您的客户端代码从其服务器读取数据的权限。

改为使用服务器端代码读取数据。

+0

了解!就一个问题。 为什么它会工作,如果我从快递中读取数据,是不是一样? – JoseAPL

+1

这是不一样的。 Express无法访问apple.com有权访问的浏览器的任何识别特征(例如cookie或发送来自属于用户的IP的请求的能力)。 – Quentin

+1

因为express和Node没有在Web浏览器内执行。这是浏览器,而不是服务,强制执行单一来源策略。 Web服务本身只能通知浏览器是否允许CORS。节点是JavaScript,但是是独立的,它不是一个网络浏览器,并不像一个。 – PMV