1

需要帮助解决此问题。我们尝试了很多不同的东西,但由于某种原因,访问控制允许来源不允许来源错误在尝试访问敏锐时不断弹出

加载资源失败:服务器响应状态为 404 (Not Found) admin:1 XMLHttpRequest cannot load 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"
    });
});

这些我们是标题和起源

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

});

4

3 回答 3

2

上面的配置存在一些问题。试试这个:

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"
  });
});
于 2016-06-22T02:33:10.317 回答
2

消息“ Response for preflight has invalid HTTP status code 404 ”表明服务器没有正确处理 OPTIONS 类型的请求。“预检请求”涉及浏览器首先与服务器检查服务器是否会接受实际请求。例如,如果您的代码是

GET http://another-server.com/blah

那么现代浏览器会首先发出这个请求:

OPTIONS http://another-server.com/blah(并且,在标头中具有适当的值),期望响应标头中有特殊值,只有在此之后它将继续使用原始的GET.

OPTIONS有点不可预测,但您可以在 Chrome/Firefox/IE 开发工具 (F12) 的网络部分看到这些请求。

换句话说,该服务要么没有设计为支持 CORS,要么没有正确编码。

于 2016-03-17T21:48:50.883 回答
1

只是一些我无法发表评论的基本故障排除。

此代码段执行一个简单的 CORS 请求,该请求返回 404 错误“找不到资源”。然后它使用预检发出第二个 CORS 请求,但失败并出现以下错误:

跨域请求被阻止:同源策略不允许在https://api.keen.io/3.0/projects/queries读取远程资源。这可以通过将资源移动到同一域或启用 CORS 来解决。

在代码中,我们在第二个请求中设置了一个自定义标头。这会触发预检。我们还使用 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>

于 2016-03-17T22:57:52.930 回答