No' Access-Control-Allow-Origin' header - Node Express

时间:2016-12-02 17:32:07

标签: javascript jquery node.js express spotify

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

  

:8000 /#=的access_token AccessTokenProvidedBySpotify   XMLHttpRequest无法加载   http://XXX.XX.XXX.XXX/presave。对预检的反应   请求未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://XXX.XX.XXX.XXX:8000'因此是不允许的   访问。

我尝试将以下代码添加到我的app.js快递应用中,但它没有用。我尝试了其他我能在网上找到的其他东西,但无法让它发挥作用。

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

1 个答案:

答案 0 :(得分: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)
    }
});