如何使用expression式框架在节点js中设置cookie?

在我的应用程序中,我需要使用express framework来设置一个cookie。我已经尝试了下面的代码,但是它没有设置cookie。

任何人都可以帮助我做到这一点?

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

在Express中使用中间件的顺序很重要:之前声明的中间件将首先被调用,如果它可以处理请求,那么以后声明的任何中间件都不会被调用。

如果express.static正在处理请求,则需要移动中间件:

 // 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')); 

另外,中间件需要结束一个请求(通过发回一个响应),或者把请求传递给下一个中间件。 在这种情况下,我已经通过在cookie被设置时调用next()来完成后者。

设置Cookie?

 res.cookie('cookieName', 'cookieValue') 

读取Cookie?

 req.cookies 

演示

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

不完全回答你的问题,但我发现你的问题寻找我的问题的答案。 所以我把它张贴在这里,也许它会帮助别人。

我的问题是,cookie是在服务器响应中设置的,但没有被浏览器保存。 服务器响应返回了Cookie设置:

 Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT 

但是cookie从来没有被浏览器保存过。

这就是我解决它的方法。

我在客户端代码中使用fetch 。 如果您没有在fetch选项中指定credentials: 'include' ,则虽然服务器响应设置了cookie,但Cookie不会被发送到服务器,也不会被浏览器保存。

例:

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

希望它有助于某人。

设置一个cookie:

 res.cookie('cookie', 'monster') 

https://expressjs.com/en/4x/api.html#res.cookie

阅读一个cookie:
(使用cookieparsing器中间件)

 req.cookies['cookie'] 

https://expressjs.com/en/4x/api.html#req.cookies