Express session的功能介绍

407 阅读3分钟

默认情况下,Express请求是连续的,没有请求可以相互链接。没有办法知道这个请求是否来自之前已经执行过请求的客户端。

除非使用某种机制使之成为可能,否则用户无法被识别。

这就是会话的作用。

实现后,你的API或网站的每个用户都将被分配一个唯一的会话,这允许你存储用户的状态。

我们将使用express-session 模块,它由Express团队维护。

你可以通过以下方式安装它

npm install express-session

来安装它,一旦完成,你就可以在你的应用程序中用以下方式实例化它

const session = require('express-session')

这是一个中间件,所以你在Express中安装它时要使用

const express = require('express')
const session = require('express-session')

const app = express()
app.use(session({
  'secret': '343ji43j4n3jn4jk3n'
}))

完成后,所有对应用程序路由的请求现在都在使用会话。

secret 是唯一需要的参数,但你还可以使用许多其他参数。对于你的应用程序来说,它应该是一个随机的唯一字符串。

会话被附加到请求上,所以你可以在这里使用req.session 来访问它。

app.get('/', (req, res, next) => {
  // req.session
}

这个对象可以用来从会话中获取数据,也可以用来设置数据。

req.session.name = 'Flavio'
console.log(req.session.name) // 'Flavio'

这个数据在存储时被序列化为JSON,所以你可以安全地使用嵌套对象。

你可以使用会话将数据传达给以后执行的中间件,或者在以后的请求中检索数据。

会话数据存储在哪里?这取决于你如何设置express-session 模块。

它可以将会话数据存储在

  • 内存,不用于生产
  • 一个数据库,如MySQL或Mongo
  • 一个内存缓存,如Redis或Memcached

github.com/expressjs/s…,有一个很大的第三包清单,实现了各种不同的兼容缓存存储。

所有的解决方案都将会话ID存储在一个cookie中,并在服务器端保留数据。客户端将收到cookie中的会话ID,并将其与每个HTTP请求一起发送。

我们将在服务器端引用它,将会话ID与本地存储的数据联系起来。

内存是默认的,它不需要你进行特殊的设置,它是最简单的,但它只用于开发目的。

最好的选择是像Redis这样的内存缓存,为此你需要设置它自己的基础设施。

另一个在Express中管理会话的流行包是cookie-session ,它有一个很大的区别:它将数据存储在客户端的cookie中。我不推荐这样做,因为在cookie中存储数据意味着它被存储在客户端,并在用户的每一个请求中来回发送。它的大小也是有限的,因为它只能存储4千字节的数据。 Cookie也需要安全,但默认情况下它们不是,因为安全的Cookies在HTTPS网站上是可能的,如果你有代理,你需要配置它们。