Javascript 有没有一种方法可以使用';卸载\navigator.sendBeacon'+';图形ql';?

Javascript 有没有一种方法可以使用';卸载\navigator.sendBeacon'+';图形ql';?,javascript,graphql,apollo,graphql-js,Javascript,Graphql,Apollo,Graphql Js,在选项卡\浏览器关闭时,我需要将数据发送到服务器。我发现(基于)建议使用sendBeacon。显示了为了通过Ajax将数据发送到服务器,必须如何准备数据。我重复了答案中的结构: window.addEventListener('unload', this.sendDataToServer, false) sendDataToServer () { myData = JSON.stringify({ 'mutation': `mutation EmailAuth($email:

在选项卡\浏览器关闭时,我需要将数据发送到服务器。我发现(基于)建议使用
sendBeacon
。显示了为了通过Ajax将数据发送到服务器,必须如何准备数据。我重复了答案中的结构:

window.addEventListener('unload', this.sendDataToServer, false)

sendDataToServer () {
    myData = JSON.stringify({
    'mutation': `mutation EmailAuth($email: String!, $password: String!) {
        getOrCreateUser(email: $email, password: $password) {
        token
        }
    }
    `,
    'variables': {email: 'test@test.net', password: 'Test'}
    })

    navigator.sendBeacon('http://localhost:8000/graphql', myData)
}
在本例中,Django显示:
“POST/graphql HTTP/1.1”400 53

我还在互联网上找到了带有
Blob
的版本:

window.addEventListener('unload', this.sendDataToServer, false)

sendDataToServer () {
    let headers = {
        type: 'application/json'
    }
    let myBlob = new Blob([JSON.stringify({
        'mutation': `mutation EmailAuth($email: String!, $password: String!) {
            getOrCreateUser(email: $email, password: $password) {
            token
            }
        }
        `,
        'variables': {email: 'test@test.net', password: 'Test'}
    })], headers)

    navigator.sendBeacon('http://localhost:8000/graphql', myBlob)
}
但在这种情况下,根本没有任何Django的反应


如何将前端上的数据包装成GraphQL格式,并以服务器端可以接受的方式将其放入
sendBeacon
中?

通过使用按钮而不是
卸载
找到
Blob
无法工作的原因。问题在于chrome浏览器。控制台显示:
Uncaught DomeException:未能在“Navigator”上执行“sendBeacon”:暂时禁用了sendBeacon(),该Blob的类型不是内容类型请求标头的任何CORS safelisted值。看见http://crbug.com/490015 有关详细信息。

Django正在等待
application/json
类型的请求,根据请求,这是不安全的


对于Firefox,这个问题可以通过Django的包
corsheaders
来解决,并将
CORS\u ALLOW\u CREDENTIALS=True
添加到设置中。

是的,为什么不是呢?@KevinB,问题已经澄清了是的,我不理解其中的变异/任何部分,如果它导致发送ajax请求,这可以通过sendBeacon完成。