默认情况下,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网站上是可能的,如果你有代理,你需要配置它们。