我如何设置cookie在节点js使用express框架?

在我的应用程序中,我需要使用快捷框架设置一个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);
474409 次浏览

在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解析器是一个单独的npm包,所以不用

app.use(express.cookieParser());

你需要使用npm i cookie-parser单独安装它,然后将其用作:

const cookieParser = require('cookie-parser');
app.use(cookieParser());

饼干?

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

读过饼干吗?

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
res.send('')


})

我不是在回答你的问题,但我在寻找一个问题的答案时,遇到了你的问题。也许它会帮助其他人。

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

服务器返回设置了cookie的响应:

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

我就是这样解出来的。

我在客户端代码中使用了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

< p > < br > 读饼干:
(使用cookie-parser中间件)

req.cookies['cookie']

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

在express中设置cookie非常简单

  1. 首先安装cookie-parser
npm install cookie-parser
  1. 使用中间件
const cookieParser = require('cookie-parser');
app.use(cookieParser());
  1. 设置cookie 知道更多
res.cookie('cookieName', '1', { expires: new Date(Date.now() + 900000), httpOnly: true })
  1. 访问cookie 知道更多
console.dir(req.cookies.cookieName)

完成了!

同构读cookie助手:

function getCookieValue(cookieName = '', cookie = '') {
const matches = cookie.match(`(^|[^;]+)\\s*${cookieName}\\s*=\\s*([^;]+)`)
return matches ? matches.pop() : ''
}


// Node with express:
getCookieValue('cookieName', req.headers.cookie)


// Browser:
getCookieValue('cookieName', document.cookie)

用express写入节点:

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

在浏览器中编写:

function setCookie(
cname,
cvalue,
exdays = 100 * 365 /* 100 days */
) {
const now = new Date()
const expireMs = exdays * 24 * 60 * 60 * 1000
now.setTime(now.getTime() + expireMs)


document.cookie = `${cname}=${cvalue};expires=${now.toUTCString()};path=/`
}


// Example of usage
setCookie('cookieName', 'cookieValue')
  1. 设置cookie可以这样做:

    res.cookie('cookie name', 'cookie value', [options])
    

,其中cookie_name是您希望设置的cookie的名称(字符串),例如- "token",而cookie值是您希望存储在该cookie中的值(字符串)。 至于选项,你可以在这里阅读更多: https://expressjs.com/en/api.html < / p >

选项的一个例子是“maxAge”,它指示cookie的有效期,例如在分配认证令牌时使用,并且您希望限制用户在重新登录之前可以保持登录的时间。

  1. 读取cookie可以这样做:

     req.cookies['cookie name']
    

它将返回cookie的值。

如果你在设置一个请求有多个cookie时有问题

试试这个方法:

res.setHeader('Set-Cookie', [
`accessToken=${accessToken}; HttpOnly; Path=/; Max-Age=${60 * 60}; Secure=True;`,
`refreshToken=${refreshToken}; HttpOnly; Path=/; Max-Age=${60 * 60 * 24 * 7 * 2}; Secure=True;`
]);