从前端到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)
}
});
答案 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)
}
});