前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket

# cookie-parser

30 秒速记

  • cookie-parser 是 Express 的中间件:把请求头里的 Cookie 字符串解析成 req.cookies 对象
  • 传了 secret 就额外验签,结果放进 req.signedCookies;验签失败的值是 false
  • 签名 ≠ 加密:签名后的 cookie 里明文原样可见,只是改了会被发现
  • 写 cookie 用的是 Express 的 res.cookie(name, val, { signed: true }),和 cookie-parser 共用同一个 secret
  • 签名只防篡改,不防偷看、不防重放;登录态还是存随机 session id,配 httpOnly、secure、sameSite

cookie-parser 干两件事:把 Cookie 请求头解析成对象,以及校验签名 cookie 有没有被改过。 签名的做法是把原值和一段 HMAC 拼在一起,服务端拿 secret 重算一遍比对,对不上就判定被篡改。很多人把这个说成「cookie 加密」,这是最常见的误解:打开浏览器 DevTools 就能看到原值。所以它适合放「可以给用户看、但不能让用户改」的东西,敏感信息要么不放 cookie,要么真加密。

理解「cookie-parser」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 security 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

cookie-parser 的源码不长,核心流程可以用几行代码说清:

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

app.use(cookieParser('my-secret'));

app.get('/set', (req, res) => {
  res.cookie('plain', 'hello');                       // 普通 cookie
  res.cookie('uid', '42', { signed: true, httpOnly: true }); // 签名 cookie
  res.end('ok');
});

app.get('/read', (req, res) => {
  console.log(req.cookies);       // { plain: 'hello' }
  console.log(req.signedCookies); // { uid: '42' },被改过则是 { uid: false }
  res.end('ok');
});

app.listen(3000);
@前端进阶之旅: 代码已经复制到剪贴板

浏览器里 uid 的实际值是 s:42.<签名>,s: 前缀表示这是签名 cookie,. 后面是用 secret 对 42 算出的 HMAC-SHA256(base64 编码,去掉末尾 =)。验签时取出 . 前面的原值,用同一个 secret 重算签名并比对,一致就返回原值,否则返回 false。

当前 1.4.x 版本里,验签过的 cookie 会从 req.cookies 挪到 req.signedCookies,所以读签名 cookie 要去 req.signedCookies 拿。另外值以 j: 开头的会被当成 JSON 解析,这是 res.cookie 写入对象时自动加的前缀。

面试官追问

追问 1不装 cookie-parser,req.cookies 是什么?
参考回答

是 undefined。Express 4 起不再内置 cookie 解析,只能自己读 req.headers.cookie 去解析,或者装这个中间件。写 cookie 的 res.cookie 倒是 Express 自带的。

追问 2用户把 cookie 里的 role=user 改成 role=admin,签了名的话服务端能发现吗?
参考回答

能。签名是对原值算的 HMAC,改了值签名就对不上,req.signedCookies.role 会变成 false。不过权限这种东西我不会放 cookie,放服务端 session 里查更稳。

追问 3签名 cookie 里能放手机号吗?
参考回答

不建议。签名不隐藏内容,s:13800000000.xxxx 前半段谁都能读。真要放就用 AES-GCM 加密后再写,或者只放一个随机 id 在服务端查。

追问 4secret 要换,怎么不让所有用户一下子掉登录?
参考回答

cookieParser 支持传数组,比如 cookieParser(['new', 'old']):用第一个签新 cookie,验签时依次尝试每一个。过渡期结束、旧 cookie 都过期了,再把 old 去掉。

追问 5cookie-parser 和 express-session 一起用要注意什么?
参考回答

express-session 从 1.5 起自己读写 cookie,不再依赖 cookie-parser。两个都用的话 secret 要保持一致,不然一个签一个验会对不上。

# 文章导读

30 秒速记

  • cookie-parser 是 Express 官方脚手架内置的中间件,负责解析 cookie
  • 用起来就一行 app.use(cookieParser(secret)),踩坑基本都出在签名和验签机制没搞懂
  • 分工:Express 的 res.cookie 负责签名写入,cookie-parser 负责解析和验签,两边共用一个 secret
  • 签名的价值是防篡改,不是加密,这是整篇最想纠正的误解

这篇要讲清楚的是 Express 加 cookie-parser 怎么给 cookie 签名、怎么验签,以及签名到底能保证什么安全。 平时用的时候几乎感觉不到它,出问题一般是这几类:签了名却去 req.cookies 里取不到值,换了 secret 用户全掉线,或者以为签名后别人就看不到内容。只要把「签名是原值加 HMAC」这一点吃透,这些问题都能自己推出来。

cookie-parser是Express的中间件,用来实现cookie的解析,是官方脚手架内置的中间件之一。

它的使用非常简单,但在使用过程中偶尔也会遇到问题。一般都是因为对Express + cookie-parser的签名、验证机制不了解导致的。

本文深入讲解Express + cookie-parser的签名和验证的实现机制,以及cookie签名是如何增强网站的安全性的。

面试官追问

追问 1cookie 签名和 cookie 加密,一句话说区别?
参考回答

签名是「能看不能改」,原值明文放着,后面附一段校验码;加密是「看都看不懂」,没有密钥还原不出原值。cookie-parser 做的是前者。

追问 2设置了 signed: true,但 req.cookies.nick 读出来是 undefined,为什么?
参考回答

验签通过的 cookie 被放进了 req.signedCookies,同时从 req.cookies 里删掉了。改成读 req.signedCookies.nick 就行。

追问 3res.cookie(..., { signed: true }) 报错说缺 secret,是哪没配?
参考回答

res.cookie 签名用的是 req.secret,这个值是 cookieParser(secret) 挂上去的。中间件没传 secret,或者注册顺序在路由后面,req.secret 就是空的。

追问 4前后端分离项目,接口用 token 放在 Authorization 头里,还需要 cookie-parser 吗?
参考回答

不需要。它只处理 Cookie 头,鉴权完全不走 cookie 的话装了也用不上。如果 refresh token 放在 httpOnly cookie 里,那还是要它来解析。

# 入门例子:cookie设置与解析

30 秒速记

  • 写 cookie:res.cookie('nick', 'chyingp') → 响应头 Set-Cookie: nick=chyingp; Path=/
  • 读 cookie:cookie-parser 解析请求头 Cookie,挂到 req.cookies
  • 第一次访问读不到,第二次才有:cookie 是浏览器下次请求才带上来的
  • 不传 secret 时它基本就等于 req.cookies = cookie.parse(req.headers.cookie || '')
  • 中间件要注册在读 cookie 的路由前面,否则 req.cookies 是 undefined

不签名时,cookie-parser 做的事很简单:把请求头里 a=1; b=2 这样的字符串解析成 { a: '1', b: '2' } 挂到 req.cookies。 写 cookie 则是 Express 自己的 res.cookie,它会往响应里加一个 Set-Cookie 头。新手常问为什么刚设置完读不到,因为设置是写在这次响应里的,浏览器要等下一次请求才会把它带回来,所以同一个请求里读不到刚写的值。

先从最简单的例子来看下cookie-parser的使用,下面采用默认配置。

  • cookie设置:使用Express的内置方法
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
      • 文章导读
      • 入门例子:cookie设置与解析
      • 进阶例子:cookie签名与解析
      • cookie签名、解析实现剖析
        • cookie签名
        • 签名cookie解析
      • cookie签名的作用
      • 签名就能够确保安全吗
      • 小结
      • 相关链接
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket
完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

cookie-parser|Nodejs专题系列

# cookie-parser

30 秒速记

  • cookie-parser 是 Express 的中间件:把请求头里的 Cookie 字符串解析成 req.cookies 对象
  • 传了 secret 就额外验签,结果放进 req.signedCookies;验签失败的值是 false
  • 签名 ≠ 加密:签名后的 cookie 里明文原样可见,只是改了会被发现
  • 写 cookie 用的是 Express 的 res.cookie(name, val, { signed: true }),和 cookie-parser 共用同一个 secret
  • 签名只防篡改,不防偷看、不防重放;登录态还是存随机 session id,配 httpOnly、secure、sameSite

cookie-parser 干两件事:把 Cookie 请求头解析成对象,以及校验签名 cookie 有没有被改过。 签名的做法是把原值和一段 HMAC 拼在一起,服务端拿 secret 重算一遍比对,对不上就判定被篡改。很多人把这个说成「cookie 加密」,这是最常见的误解:打开浏览器 DevTools 就能看到原值。所以它适合放「可以给用户看、但不能让用户改」的东西,敏感信息要么不放 cookie,要么真加密。

理解「cookie-parser」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 security 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

cookie-parser 的源码不长,核心流程可以用几行代码说清:

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

app.use(cookieParser('my-secret'));

app.get('/set', (req, res) => {
  res.cookie('plain', 'hello');                       // 普通 cookie
  res.cookie('uid', '42', { signed: true, httpOnly: true }); // 签名 cookie
  res.end('ok');
});

app.get('/read', (req, res) => {
  console.log(req.cookies);       // { plain: 'hello' }
  console.log(req.signedCookies); // { uid: '42' },被改过则是 { uid: false }
  res.end('ok');
});

app.listen(3000);
@前端进阶之旅: 代码已经复制到剪贴板

浏览器里 uid 的实际值是 s:42.<签名>,s: 前缀表示这是签名 cookie,. 后面是用 secret 对 42 算出的 HMAC-SHA256(base64 编码,去掉末尾 =)。验签时取出 . 前面的原值,用同一个 secret 重算签名并比对,一致就返回原值,否则返回 false。

当前 1.4.x 版本里,验签过的 cookie 会从 req.cookies 挪到 req.signedCookies,所以读签名 cookie 要去 req.signedCookies 拿。另外值以 j: 开头的会被当成 JSON 解析,这是 res.cookie 写入对象时自动加的前缀。

面试官追问

追问 1不装 cookie-parser,req.cookies 是什么?
参考回答

是 undefined。Express 4 起不再内置 cookie 解析,只能自己读 req.headers.cookie 去解析,或者装这个中间件。写 cookie 的 res.cookie 倒是 Express 自带的。

追问 2用户把 cookie 里的 role=user 改成 role=admin,签了名的话服务端能发现吗?
参考回答

能。签名是对原值算的 HMAC,改了值签名就对不上,req.signedCookies.role 会变成 false。不过权限这种东西我不会放 cookie,放服务端 session 里查更稳。

追问 3签名 cookie 里能放手机号吗?
参考回答

不建议。签名不隐藏内容,s:13800000000.xxxx 前半段谁都能读。真要放就用 AES-GCM 加密后再写,或者只放一个随机 id 在服务端查。

追问 4secret 要换,怎么不让所有用户一下子掉登录?
参考回答

cookieParser 支持传数组,比如 cookieParser(['new', 'old']):用第一个签新 cookie,验签时依次尝试每一个。过渡期结束、旧 cookie 都过期了,再把 old 去掉。

追问 5cookie-parser 和 express-session 一起用要注意什么?
参考回答

express-session 从 1.5 起自己读写 cookie,不再依赖 cookie-parser。两个都用的话 secret 要保持一致,不然一个签一个验会对不上。

# 文章导读

30 秒速记

  • cookie-parser 是 Express 官方脚手架内置的中间件,负责解析 cookie
  • 用起来就一行 app.use(cookieParser(secret)),踩坑基本都出在签名和验签机制没搞懂
  • 分工:Express 的 res.cookie 负责签名写入,cookie-parser 负责解析和验签,两边共用一个 secret
  • 签名的价值是防篡改,不是加密,这是整篇最想纠正的误解

这篇要讲清楚的是 Express 加 cookie-parser 怎么给 cookie 签名、怎么验签,以及签名到底能保证什么安全。 平时用的时候几乎感觉不到它,出问题一般是这几类:签了名却去 req.cookies 里取不到值,换了 secret 用户全掉线,或者以为签名后别人就看不到内容。只要把「签名是原值加 HMAC」这一点吃透,这些问题都能自己推出来。

cookie-parser是Express的中间件,用来实现cookie的解析,是官方脚手架内置的中间件之一。

它的使用非常简单,但在使用过程中偶尔也会遇到问题。一般都是因为对Express + cookie-parser的签名、验证机制不了解导致的。

本文深入讲解Express + cookie-parser的签名和验证的实现机制,以及cookie签名是如何增强网站的安全性的。

面试官追问

追问 1cookie 签名和 cookie 加密,一句话说区别?
参考回答

签名是「能看不能改」,原值明文放着,后面附一段校验码;加密是「看都看不懂」,没有密钥还原不出原值。cookie-parser 做的是前者。

追问 2设置了 signed: true,但 req.cookies.nick 读出来是 undefined,为什么?
参考回答

验签通过的 cookie 被放进了 req.signedCookies,同时从 req.cookies 里删掉了。改成读 req.signedCookies.nick 就行。

追问 3res.cookie(..., { signed: true }) 报错说缺 secret,是哪没配?
参考回答

res.cookie 签名用的是 req.secret,这个值是 cookieParser(secret) 挂上去的。中间件没传 secret,或者注册顺序在路由后面,req.secret 就是空的。

追问 4前后端分离项目,接口用 token 放在 Authorization 头里,还需要 cookie-parser 吗?
参考回答

不需要。它只处理 Cookie 头,鉴权完全不走 cookie 的话装了也用不上。如果 refresh token 放在 httpOnly cookie 里,那还是要它来解析。

# 入门例子:cookie设置与解析

30 秒速记

  • 写 cookie:res.cookie('nick', 'chyingp') → 响应头 Set-Cookie: nick=chyingp; Path=/
  • 读 cookie:cookie-parser 解析请求头 Cookie,挂到 req.cookies
  • 第一次访问读不到,第二次才有:cookie 是浏览器下次请求才带上来的
  • 不传 secret 时它基本就等于 req.cookies = cookie.parse(req.headers.cookie || '')
  • 中间件要注册在读 cookie 的路由前面,否则 req.cookies 是 undefined

不签名时,cookie-parser 做的事很简单:把请求头里 a=1; b=2 这样的字符串解析成 { a: '1', b: '2' } 挂到 req.cookies。 写 cookie 则是 Express 自己的 res.cookie,它会往响应里加一个 Set-Cookie 头。新手常问为什么刚设置完读不到,因为设置是写在这次响应里的,浏览器要等下一次请求才会把它带回来,所以同一个请求里读不到刚写的值。

先从最简单的例子来看下cookie-parser的使用,下面采用默认配置。

  • cookie设置:使用Express的内置方法res.cookie。
  • cookie解析:使用cookie-parser中间件。
var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();

app.use(cookieParser());

app.use(function (req, res, next) {
  console.log(req.cookies.nick); // 第二次访问,输出chyingp
  next();
});

app.use(function (req, res, next) {
  res.cookie('nick', 'chyingp');
  res.end('ok');
});

app.listen(3000);
@前端进阶之旅: 代码已经复制到剪贴板

在当前场景下,cookie-parser中间件大致实现如下:

app.use(function (req, res, next) {
  req.cookies = cookie.parse(req.headers.cookie);
  next();
});
@前端进阶之旅: 代码已经复制到剪贴板

← clustercrypto模块之理论篇 →

fe