XMLHttpRequest 无法加载
XMLHttpRequest cannot load
需要帮助解决此问题。我们已经尝试了很多不同的方法,但由于某些原因,当尝试访问 keen
时,Access-Control-Allow-Origin 不允许 Origin 错误不断弹出
加载资源失败:服务器返回状态 404(未找到)
admin:1 XMLHttpRequest 无法加载 https://api.keen.io/3.0/projects//queries/。预检响应具有无效的 HTTP 状态代码 404
这是admin.js
中的代码
<script type="text/javascript">
var client = new Keen({
projectId: "id", // String (required always)
writeKey: "key", // String (required for sending)
readKey: "key", // String (required for querying)
// protocol: "https", // String (optional: https | http | auto)
// host: "api.keen.io/3.0", // String (optional)
requestType: "jsonp" // String (optional: jsonp, xhr, beacon)
});
Keen.ready(function() {
var metric = new Keen.Query("newBusiness", {
analysisType: "count",
timeframe: "this_1_month"
});
client.draw(metric, document.getElementById("newBusiness-count-chart"), {
chartType: "metric",
label: "Count of Businesses"
});
});
这些是我们的 headers 和起源
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', 'https://api.keen.io:443, fonts.googleapis.com');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Origin, X-Requested-With, Accept');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-withCredentials', true);
next();
});
消息“预检响应具有无效的 HTTP 状态代码 404”表明服务器未正确处理 OPTIONS 类型的请求。 "Preflight request" 与浏览器首先检查服务器是否接受实际请求有关。例如。如果您的代码是
GET http://another-server.com/blah
那么现代浏览器首先会发出这样的请求:
OPTIONS http://another-server.com/blah
(以及 headers 中的适当值),期望响应 headers 中的特殊值,只有在此之后它才会继续原来的 GET
.
有些不可预测,但您可以看到这些 OPTIONS
请求记录在 Chrome/Firefox/IE dev-tools (F12) 的网络部分。
换句话说,该服务不是为支持 CORS 而设计的,就是编码不正确。
只是一些基本的故障排除,我无法在评论中给出。
此代码段执行 simple CORS request which returns a 404 error "resource not found". It then makes a second CORS request with a preflight 失败并出现此错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading
the remote resource at https://api.keen.io/3.0/projects/queries. This
can be fixed by moving the resource to the same domain or enabling
CORS.
在代码中我们在第二个请求中设置了自定义 header。这会触发预检。我们还使用 try-catch 块在控制台中查看完整的错误(没有这个 Firefox 只显示 NS_ERROR_FAILURE
,这不是很有帮助)。
因此,预检 CORS 请求(即 OPTIONS)似乎存在服务器配置错误。
显示然后运行要尝试的代码片段
var url = 'https://api.keen.io/3.0/projects/queries';
var xhr = new XMLHttpRequest();
try {
xhr.open('GET', url, false );
xhr.send();
}
catch(e){}
dump('GET - no preflight');
try {
xhr.open('GET', url, false );
xhr.setRequestHeader('X-PREFLIGHT', 'forced');
xhr.send();
}
catch(e){ }
dump('GET - with preflight');
function dump(method) {
window.stdout.innerHTML += (
'METHOD = ' + method + '\n' +
xhr.status + ':' + xhr.statusText + '\n' +
xhr.getAllResponseHeaders() + '\n' +
xhr.responseText + '\n\n'
);
};
<xmp id="stdout"></xmp>
上面的配置存在一些问题。试一试:
var client = new Keen({
projectId: "id",
writeKey: "key",
readKey: "key",
requestType: "jsonp"
});
Keen.ready(function() {
var metric = new Keen.Query("count", {
eventCollection: "newBusiness", // assuming this is the collection name?
timeframe: "this_1_month"
});
client.draw(metric, document.getElementById("newBusiness-count-chart"), {
chartType: "metric",
title: "Count of Businesses"
});
});
需要帮助解决此问题。我们已经尝试了很多不同的方法,但由于某些原因,当尝试访问 keen
时,Access-Control-Allow-Origin 不允许 Origin 错误不断弹出加载资源失败:服务器返回状态 404(未找到) admin:1 XMLHttpRequest 无法加载 https://api.keen.io/3.0/projects//queries/。预检响应具有无效的 HTTP 状态代码 404
这是admin.js
中的代码<script type="text/javascript">
var client = new Keen({
projectId: "id", // String (required always)
writeKey: "key", // String (required for sending)
readKey: "key", // String (required for querying)
// protocol: "https", // String (optional: https | http | auto)
// host: "api.keen.io/3.0", // String (optional)
requestType: "jsonp" // String (optional: jsonp, xhr, beacon)
});
Keen.ready(function() {
var metric = new Keen.Query("newBusiness", {
analysisType: "count",
timeframe: "this_1_month"
});
client.draw(metric, document.getElementById("newBusiness-count-chart"), {
chartType: "metric",
label: "Count of Businesses"
});
});
这些是我们的 headers 和起源
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', 'https://api.keen.io:443, fonts.googleapis.com');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Origin, X-Requested-With, Accept');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-withCredentials', true);
next();
});
消息“预检响应具有无效的 HTTP 状态代码 404”表明服务器未正确处理 OPTIONS 类型的请求。 "Preflight request" 与浏览器首先检查服务器是否接受实际请求有关。例如。如果您的代码是
GET http://another-server.com/blah
那么现代浏览器首先会发出这样的请求:
OPTIONS http://another-server.com/blah
(以及 headers 中的适当值),期望响应 headers 中的特殊值,只有在此之后它才会继续原来的 GET
.
有些不可预测,但您可以看到这些 OPTIONS
请求记录在 Chrome/Firefox/IE dev-tools (F12) 的网络部分。
换句话说,该服务不是为支持 CORS 而设计的,就是编码不正确。
只是一些基本的故障排除,我无法在评论中给出。
此代码段执行 simple CORS request which returns a 404 error "resource not found". It then makes a second CORS request with a preflight 失败并出现此错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.keen.io/3.0/projects/queries. This can be fixed by moving the resource to the same domain or enabling CORS.
在代码中我们在第二个请求中设置了自定义 header。这会触发预检。我们还使用 try-catch 块在控制台中查看完整的错误(没有这个 Firefox 只显示 NS_ERROR_FAILURE
,这不是很有帮助)。
因此,预检 CORS 请求(即 OPTIONS)似乎存在服务器配置错误。
显示然后运行要尝试的代码片段
var url = 'https://api.keen.io/3.0/projects/queries';
var xhr = new XMLHttpRequest();
try {
xhr.open('GET', url, false );
xhr.send();
}
catch(e){}
dump('GET - no preflight');
try {
xhr.open('GET', url, false );
xhr.setRequestHeader('X-PREFLIGHT', 'forced');
xhr.send();
}
catch(e){ }
dump('GET - with preflight');
function dump(method) {
window.stdout.innerHTML += (
'METHOD = ' + method + '\n' +
xhr.status + ':' + xhr.statusText + '\n' +
xhr.getAllResponseHeaders() + '\n' +
xhr.responseText + '\n\n'
);
};
<xmp id="stdout"></xmp>
上面的配置存在一些问题。试一试:
var client = new Keen({
projectId: "id",
writeKey: "key",
readKey: "key",
requestType: "jsonp"
});
Keen.ready(function() {
var metric = new Keen.Query("count", {
eventCollection: "newBusiness", // assuming this is the collection name?
timeframe: "this_1_month"
});
client.draw(metric, document.getElementById("newBusiness-count-chart"), {
chartType: "metric",
title: "Count of Businesses"
});
});