如何使用 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

访问前端代码中express.js中设置的标头

在 Express 中设置默认响应标头

在 SessionStore 而不是 cookie 中设置 Node.js Express 会话过期时间

无法使用 NodeJS 中的 request 和 express 模块在浏览器中设置 cookie