2017-06-02 2 views
0

Wenn ich die Route /test direkt über den Browser aufrufen, finde ich, dass die Sitzung ordnungsgemäß festgelegt wurde. Aber wenn ich das gleiche von einem Ajax-Anruf mache, finde ich, dass die Sitzung nicht die Informationen hat, die ich zuvor über den anderen Weg /temp hinzugefügt hatte.Express-Sitzung funktioniert nicht für Ajax Call

Express-Session Config

{ 
    "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-Aufruf

fetch('/test').then((response) => { 
    if (response.status >= 400) { 
     console.log(response.status); 
    } 
    return response.json(); 
}).then((json) => { 
    console.log(json); 
    //do something 
}); 

Wenn ich rufe die localhost:8000/temp und dann die /test als Abruf Ajax-Aufruf rufen:

{ 
    "cookie": { 
     "path": "/", 
     "_expires": null, 
     "originalMaxAge": null, 
     "httpOnly": false, 
     "secure": false 
    }, 
    "_csrfSecret": "secret", 
    "_shared": { 
     "deviceInfo": { 
     ... 
     } 
    } 
} 

Die Eigenschaft tracking eindeutig nicht gesetzt ist. Aber wenn ich das gleiche direkt von meinem Browser localhost:8000/test nach dem ersten Aufruf locahost:8000/temp aufrufen, habe ich die TrackingInformation in der Sitzung festgelegt.

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

Antwort

2

Die Antwort war in der Ajax-Aufruf. Fetch ruft standardmäßig keine Cookies ab. Sie müssen das Senden von Cookies aktivieren, indem Sie credential: 'same-origin' als Option übergeben. So soll der Abruf Anruf gewesen sein -

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

Blick auf this für weitere Informationen.

+0

Über eine Stunde verschwendet, danke! Sieht so aus, als wäre es in den Dokumenten, nur ist nicht sehr hervorgehoben (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) 'Standardmäßig wird fetch nicht senden oder Empfangen von Cookies vom Server, was zu nicht authentifizierten Anfragen führt, wenn die Site auf die Pflege einer Benutzersitzung angewiesen ist (zum Senden von Cookies muss der Kopf der Anmeldeinformationen gesendet werden). " –