我正在尝试将ajax请求包装到库中。我这样做,所以每次我发出请求时我都不需要设置标题。该库是异步加载的,并有一个init方法来设置api密钥。代码似乎有效,但每次启动api调用时我都会收到2个请求。图书馆非常基础,远未完成。
发出请求的api来自节点&基于快递的api。当在休息客户端中发出相同的请求时,他们都会返回正确的数据和信息。 http状态代码。
以下是加载我的库的代码:
(function(d) {
var api_key='MY-API-KEY';
var js,id='tracking-api',ref=d.getElementsByTagName('script')[0];
if(d.getElementById(id)){return;}
js=d.createElement('script');js.id=id;js.async=true;
js.src="/test/track.api.min.js";
js.onload=function(){stats.init({api_key:api_key})}
ref.parentNode.insertBefore(js, ref);
})(document);
未缩小的图书馆:
(function(window){
'use strict';
/**
* This library requires jquery to run
*/
var stats= {
url : 'http://localhost/stats_api/',
api_key: undefined,
// The init method will take an api key and set it for our headers
// used with all api requests
init: function(opts) {
if(opts.api_key === undefined) {
stats.logMsg('Sorry you need to supply an api key');
return false;
}
stats.api_key = opts.api_key;
},
// Main api call method nice and simple use - we just give it the
// method we require and we will be given a json response
api: function(method, callback) {
jQuery.ajax({
url: stats.url + method,
dataType: 'JSON',
type: 'GET',
beforeSend: function(xhr) {
xhr.setRequestHeader('api_key', stats.api_key);
},
success: function(response) {
callback(response);
},
error: function(jqXHR, textStatus, errorThrown) {
btStats.logMsg(jqXHR);
btStats.logMsg('Error:' + textStatus);
}
});
},
// Wrap up the console log function so we can still use it but
// not break IE8
logMsg: function(message) {
if(window.console && console.log) {
console.log(message);
}
}
};
// Attatch our plugin to the window
if(!window.stats){window.stats=stats};
})(window);
我用来制作api请求的代码是这样的:
stats.api('/visits', function(response){
console.log(response);
});
响应始终正确返回,但大多数请求404.当它们404时,它似乎也是第二次运行查询。
所以我猜问题是,为什么要求两次?为什么当请求成功时jQuery返回404。
答案 0 :(得分:1)
好吧事实证明这是一个非常简单的问题,因为我的代码运行跨域jQuery正在发送带有OPTIONS方法的预检请求(之前没有注意到)404来自我的节点api as测试不支持该方法我已经在api中添加了一些中间件
app.use(function(req, res, next){
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Headers", "api_key");
if(req.method == 'OPTIONS') {
res.send(200);
}
else {
next();
}
});
不太理想,因为这将允许所有路由的跨域脚本,所以我将不得不将其锁定一段时间。