Dans mon application, je dois définir un cookie à l'aide du framework express. J'ai essayé le code suivant, mais ce n'est pas le cookie.
Quelqu'un peut-il m'aider à le faire?
var express = require('express'), http = require('http');
var app = express();
app.configure(function(){
app.use(express.cookieParser());
app.use(express.static(__dirname + '/public'));
app.use(function (req, res) {
var randomNumber=Math.random().toString();
randomNumber=randomNumber.substring(2,randomNumber.length);
res.cookie('cokkieName',randomNumber, { maxAge: 900000, httpOnly: true })
console.log('cookie have created successfully');
});
});
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(5555);
L'ordre dans lequel vous utilisez un middleware dans Express a de l'importance: le middleware déclaré plus tôt sera appelé en premier, et s'il peut traiter une demande, tout middleware déclaré plus tard ne sera pas appelé.
Si express.static
traite la demande, vous devez déplacer votre middleware vers le haut:
// need cookieParser middleware before we can do anything with cookies
app.use(express.cookieParser());
// set a cookie
app.use(function (req, res, next) {
// check if client sent cookie
var cookie = req.cookies.cookieName;
if (cookie === undefined)
{
// no: set a new cookie
var randomNumber=Math.random().toString();
randomNumber=randomNumber.substring(2,randomNumber.length);
res.cookie('cookieName',randomNumber, { maxAge: 900000, httpOnly: true });
console.log('cookie created successfully');
}
else
{
// yes, cookie was already present
console.log('cookie exists', cookie);
}
next(); // <-- important!
});
// let static middleware do its job
app.use(express.static(__dirname + '/public'));
En outre, le middleware doit soit mettre fin à une requête (en renvoyant une réponse) ou transmettre la requête au middleware suivant. Dans ce cas, j'ai fait le dernier en appelant next()
lorsque le cookie a été défini.
Set Cookie?
res.cookie('cookieName', 'cookieValue')
Lire Cookie?
req.cookies
démo
const express('express')
, cookieParser = require('cookie-parser'); // in order to read cookie sent from client
app.get('/', (req,res)=>{
// read cookies
console.log(req.cookies)
let options = {
maxAge: 1000 * 60 * 15, // would expire after 15 minutes
httpOnly: true, // The cookie only accessible by the web server
signed: true // Indicates if the cookie should be signed
}
// Set cookie
res.cookie('cookieName', 'cookieValue', options) // options is optional
res.send('')
})
Pas exactement répondre à votre question, mais j'ai trouvé votre question à la recherche d'une réponse à mon problème. Alors je le poste ici, peut-être que ça aidera quelqu'un.
Mon problème était que les cookies étaient configurés dans la réponse du serveur, mais n'étaient pas enregistrés par le navigateur. La réponse du serveur est revenue avec les cookies définis:
Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT
Mais le cookie n'a jamais été enregistré par un navigateur.
Voici comment je l'ai résolu.
J'utilise fetch
dans un code côté client. Si vous ne spécifiez pas les options credentials: 'include'
dans fetch
, les cookies ne sont ni envoyés au serveur, ni enregistrés par un navigateur, bien que la réponse du serveur en définisse des.
Exemple:
var headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
return fetch('/your/server_endpoint', {
method: 'POST',
mode: 'same-Origin',
redirect: 'follow',
credentials: 'include', // Don't forget to specify this if you need cookies
headers: headers,
body: JSON.stringify({
first_name: 'John',
last_name: 'Doe'
})
})
J'espère que ça aide quelqu'un.
Définir un cookie:
res.cookie('cookie', 'monster')
https://expressjs.com/en/4x/api.html#res.cookie
Lire un cookie:
(en utilisant cookie-analyseur middleware)
req.cookies['cookie']