【问题标题】:No 'Access-Control-Allow-Origin' header - Node Express没有“Access-Control-Allow-Origin”标头 - Node Express
【发布时间】:2016-12-02 17:32:06
【问题描述】:

从前端并通过 jQuery,我正在向 node/express 应用程序发出 GET 请求。然后,此应用程序与 spotify API 对话以对用户进行身份验证。当我尝试调用 presave 端点时收到以下错误消息。

:8000/#access_token=AccessTokenProvidedBySpotify XMLHttpRequest 无法加载 http://XXX.XX.XXX.XXX/presave。对预检的响应 请求未通过访问控制检查:否 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此不允许使用原点“http://XXX.XX.XXX.XXX:8000” 访问。

我尝试将以下代码添加到我的app.js express 应用程序中,但没有成功。我也尝试了所有可以在网上找到的其他方法,但无法正常工作。

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();
});

app.get('/presave', function(req, res){
    var options = {
        url: 'https://api.spotify.com/v1/me',
        headers: {
            'Authorization': 'Bearer ' + access_token
        },
        json: true
    };

    requestPromise(options).then(function(body) {
        userEmail = body.email;
        userId = body.id;
        var optionsTwo = {
            url: 'https://api.spotify.com/v1/users/' + userId + '/playlists',
            headers: {
                'Authorization': 'Bearer ' + access_token
            },
            json: true
        };
        return rp(optionsTwo).then(function (body) {
            playlists = body.items;
            res.json(playlists);
        });
    }).catch(function (err) {
        console.log(err)
    })
});

编辑

我也实现了下面提供的答案,但这也不起作用。如果我console.log(req.method) 总是GET,它永远不会显示OPTIONS

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");
  if (req.method === 'OPTIONS') {
    return res.send(200);
  } else {
    return next();
  }
});

我的前端代码如下:

$.ajax({
    type: 'GET',
    url: 'http://xxx.xx.xxx.xxx/presave',
    contentType: 'application/json',
    success: function(data) {
        console.log(data)
    }
});

【问题讨论】:

  • 这一行有一个小错字:app.get('/presave', function(req, res){]。末尾有多余的]
  • @SphDev 抱歉,错字,我的代码中不是这样的
  • 您没有响应预检请求,如错误所示。
  • @KevinB 好的,关于如何消除此错误的任何指导?

标签: javascript jquery node.js express spotify


【解决方案1】:

错误消息“预检请求未通过访问控制检查”表示失败是由预检请求而不是发布请求引起的。所以你需要让 prerlight 请求通过。

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");
  if (req.method === 'OPTIONS') {
    return res.send(200);
  } else {
    return next();
  }
});

app.get('/presave', function(req, res){
   res.send('here');
});

在前端,ajax调用应该使用GET

$.ajax({
    type: 'GET',
    url: 'http://xxx.xx.xxx.xxx/presave',
    contentType: 'application/json',
    success: function(data) {
        console.log(data)
    }
});

【讨论】:

  • 我不知道为什么,因为这看起来应该可以工作,但我仍然遇到同样的错误。当我检查console.log(req.method) 时,它始终是GET 请求。它从不说OPTIONS
  • 你的ajax调用类型应该是Get。我更新了我的答案
  • 抱歉,在我的 jQuery 代码中是 GET。这不是问题,这看起来是一个非常棘手的问题
  • 我看到你更新了 ajax 以使用 Get。但是,您还更新了应用程序以在快递方面使用post。哪一个是正确的?另外,是 express 抛出的 CROS 错误,还是当您向https://api.spotify.com/v1/me 发出请求时?
  • 对不起,应该也是app.get。我在开始时稍微更改了代码以简化示例,但现在它和我一样。这是一回事,我不完全确定 CORS 错误是明确的还是发现的请求。我相信它是express,但由于这些解决方案都不起作用,也许它是 spotify。我原以为我会在网上看到一些东西,如果它是 spotift 会更常见?
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 2020-01-05
  • 2017-09-19
  • 2015-04-02
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多