216

在我的应用程序中,我需要使用 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);
4

6 回答 6

282

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

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

更新

到目前为止,cookie 解析器是一个单独的 npm 包,所以不要使用

app.use(express.cookieParser());

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

const cookieParser = require('cookie-parser');
app.use(cookieParser());
于 2013-04-25T08:09:40.590 回答
169

设置 Cookie?

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

})
于 2016-10-19T14:59:05.973 回答
49

不完全回答你的问题,但我在寻找我遇到的问题的答案时遇到了你的问题。也许它会帮助别人。

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

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

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

这就是我解决它的方法。

fetch在客户端代码中使用过。如果您未credentials: 'include'fetch选项中指定,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'
    })
})
于 2017-03-11T12:16:27.413 回答
30

设置一个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

于 2017-07-03T22:00:47.317 回答
13

在快递中设置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)

完毕!

于 2021-02-10T23:16:57.317 回答
0

同构读取 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)

在 Node 中用 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')
于 2022-02-01T09:54:54.487 回答