为什么没有d3.json发送带有请求的cookie?

时间:2018-06-06 16:42:43

标签: javascript json ajax d3.js cookies

我很擅长使用d3.js(v5)中的内置方法执行ajax请求。这是我的代码:

d3.json(uri).then(data =>console.log(data));

我在使用Cookie身份验证的应用中尝试了此操作,并保持获取401状态代码。使用chrome dev工具显示它根本没有任何cookie发送请求。

这很奇怪,因为原生javascript中的ajax请求默认发送cookie以及每个请求。以下是本机javascript中ajax请求的示例:

function nativeAjax(uri, callback) {
    let request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === 4) {
            callback(request);
        }
    }
    request.open('get', uri, true);
    request.send(null);
}
nativeAjax(uri, request => console.log(request.status));

将此插入我的应用程序,chrome dev工具显示它确实发送了身份验证cookie以及请求,而request.status确实以200显示它确实已经过身份验证。

我的问题是:

  1. 如何配置d3.json发送所需的Cookie?
  2. 如何通过状态捕获响应?例如,我想要为401响应而不是403响应做一些不同的事情。
  3. 在哪里可以阅读更完整的文档或示例,了解如何使用d3.json?我总是做本机ajax,因为我不使用jquery,但如果它是我正在使用的库的一部分,我想学习如何使用它。但是documentation几乎没有提及它,page it links to也没有帮助。大多数教程都是针对d3的早期版本而已经不再适用了。

1 个答案:

答案 0 :(得分:2)

版本5切换为使用Fetch API,默认情况下不发送任何cookie。你可以通过添加d3.json的选项来解决这个问题,以便传递给fetch:

d3.json(uri, {credentials: "same-origin"}).then(...);

或者,对于跨源请求:

d3.json(uri, {credentials: "include"}).then(...);

如果返回4XX状态(或5XX),D3将导致拒绝承诺,您可以通过向then提供第二个回调函数来处理。我欢迎更正,但我相信在这个函数中没有办法获得实际的状态代码。

我在文档中(在撰写本文时)发现的对Fetch和promises的更改的唯一提及是在更改日志中:D3 v5 Changes