Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express会话不适用于Ajax调用_Javascript_Node.js_Ajax_Session_Express - Fatal编程技术网

Javascript Express会话不适用于Ajax调用

Javascript Express会话不适用于Ajax调用,javascript,node.js,ajax,session,express,Javascript,Node.js,Ajax,Session,Express,当我直接从浏览器调用/test路由时,我发现会话设置正确。但是,当我在一个ajax调用中执行同样的操作时,我发现会话中没有我以前通过另一条路径添加的信息/temp 快速会话配置 { "key": "nsid", "secret": "some secret password", "cookie": { "path": "/", "httpOnly": false, "maxAge": null, "secur

当我直接从浏览器调用
/test
路由时,我发现会话设置正确。但是,当我在一个ajax调用中执行同样的操作时,我发现会话中没有我以前通过另一条路径添加的信息
/temp

快速会话配置

{
    "key": "nsid",
    "secret": "some secret password",
    "cookie": {
        "path": "/",
        "httpOnly": false,
        "maxAge": null,
        "secure": false
    },
    "resave": true,
    "saveUninitialized": true,
    "proxy": null
}
routes.js

router.get('/temp', (req, res) => {
    const useCase = 'card';
    req.session = req.session || {};
    req.session.trackingInformation = {};
    req.session.trackingInformation.useCase = useCase;
    req.session.save();
    console.log(req.session);
    res.render('/temp');
});

router.get('/test', (req, res) => {
    console.log(Util.inspect(req.session));
    res.send({});
});
ajax调用

fetch('/test').then((response) => {
    if (response.status >= 400) {
        console.log(response.status);
    }
    return response.json();
}).then((json) => {
    console.log(json);
    //do something
});
当我调用
localhost:8000/temp
然后调用
/test
作为fetch-ajax调用时:

{
    "cookie": {
        "path": "/",
        "_expires": null,
        "originalMaxAge": null,
        "httpOnly": false,
        "secure": false
    },
    "_csrfSecret": "secret",
    "_shared": {
        "deviceInfo": {
        ...
        }
    }
}
未设置trackingInformation属性。但是,如果我在第一次调用
locahost:8000/temp
后直接从浏览器
localhost:8000/test
调用相同的函数,我在会话中设置了跟踪信息

{
    "cookie": {
        ...
    },
    "_csrfSecret": "secret",
    "_shared": {
        "deviceInfo": {
        ...
        }
    },
    "trackingInformation": {
        "useCase": "card"
    }
}

答案就在ajax调用中。默认情况下,Fetch不会发送cookies。您需要通过传递
凭证:“同一来源”
作为选项来启用Cookie的发送。所以fetch调用应该是-

fetch('/test', {
    credentials: 'same-origin'
}).then((response) => {
    if (response.status >= 400) {
        console.log(response.status);
    }
    return response.json();
}).then((json) => {
    console.log(json);
    //do something
});

查看了解更多信息。

为此浪费了一个多小时,谢谢!看起来它位于文档中,只是没有突出显示()
默认情况下,fetch不会从服务器发送或接收任何cookie,如果站点依赖于维护用户会话(要发送cookie,必须发送凭据标头),则会导致未经验证的请求。