如何使用 express 框架在节点 js 中设置 cookie?
Posted
技术标签:
【中文标题】如何使用 express 框架在节点 js 中设置 cookie?【英文标题】:How can I set cookie in node js using express framework? 【发布时间】:2013-04-19 00:24:07 【问题描述】:在我的应用程序中,我需要使用 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);
【问题讨论】:
您如何验证未设置 cookie?你检查过浏览器得到的响应头吗? @NilsH 我已经添加了日志语句。如果它设置意味着它将显示为'cookie已成功创建'.. 好的,那么要么你的中间件没有被调用,要么前面的一些语句给出了异常。 如果我删除了 'app.use(express.static(__dirname + '/public'));'这一行意味着它设置了cookie 【参考方案1】:在 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());
【讨论】:
我还有一个问题,如何在设置 cookie 之前检查 cokkie 是否存在 我编辑了我的答案,向您展示如何检查 cookie 是否已设置。 您的页面上可能有一些 JS 和/或 CSS 文件。这些将由express.static
处理,它将在您的中间件之后 处理它们。所以对于每一个JS或者CSS文件,都会调用代码。
它没有设置 cookie 8 次,它说 cookie 已经存在。这是意料之中的。
请注意,cookie 解析器现在应该单独安装。见npmjs.com/package/cookie-parser【参考方案2】:
设置 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
res.send('')
)
【讨论】:
嗨,你能说一下什么是签名:真的吗? 如果您建议将 cookie 设置为符号,请务必注意 req.cookie 将返回空。您只能从 req.signedCookies 检索签名 cookie 你也需要添加这个:const app = express() app.use(cookieParser())
【参考方案3】:
没有完全回答您的问题,但我在寻找问题的答案时遇到了您的问题。也许它会帮助别人。
我的问题是在服务器响应中设置了 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'
)
)
【讨论】:
我已经在浏览器中检查了我的发帖请求,但这个字段没有与发帖请求一起使用? 如果使用 XHR 或 Jquery,请改用 'withCredentials: true'【参考方案4】:设置 cookie:
res.cookie('cookie', 'monster')
https://expressjs.com/en/4x/api.html#res.cookie
读取 cookie: (使用cookie-parser中间件)
req.cookies['cookie']
https://expressjs.com/en/4x/api.html#req.cookies
【讨论】:
【参考方案5】:在快递中设置cookie很容易
-
首先安装cookie-parser
npm install cookie-parser
-
使用中间件
const cookieParser = require('cookie-parser');
app.use(cookieParser());
-
设置cookieknow more
res.cookie('cookieName', '1', expires: new Date(Date.now() + 900000), httpOnly: true )
-
访问该 cookie know more
console.dir(req.cookies.cookieName)
完成!
【讨论】:
【参考方案6】:同构读取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 写入 Node:
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')
【讨论】:
以上是关于如何使用 express 框架在节点 js 中设置 cookie?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Express.js 在 Node.js 中设置路由的最佳方式
如何在 express.js node.js 中设置 X-Frame-Options