保留node.js服务器重新启动之间的会话

Dav*_*que 8 node.js

我正在开发一个node.js应用程序,我使用nodemon来运行它.我的问题是当我在服务器上进行更改并且nodemon重新启动时,我如何保持会话打开.

Jos*_*lik 9

这个答案假定您使用的是Express或Koa这两个比较流行的node.js Web框架.

在您的应用程序中,您可能有一行说明如下.

快递4

var app = require( 'express' )()
var session = require( 'express-session' )
app.use( session() ) // this is the session middleware
Run Code Online (Sandbox Code Playgroud)

KoaJS

var app = require( 'koa' )()
var session = require( 'koa-session' )
app.use( session() ) // this is the session middleware
Run Code Online (Sandbox Code Playgroud)

Web应用程序的指导思想是使其面向世界的一面尽可能无国籍.这意味着您的node.js服务器不会在请求之间保留任何信息,并且可以随时销毁和重新启动.

会话是非常有状态的事情.因此,您需要将会话数据存储在旨在长期保持数据不被破坏的内容中.这通常通过数据库(更安全)或浏览器cookie(安全性较低)来完成.

快递会话模块保持在默认的内存会话信息.这违反了无状态理念,并且会在重启时丢失会话信息.

KOA会话模块默认使用的cookies.这是无状态的,但引起了一些安全问题,因为用户可能有可能修改自己的会话变量,因此不要将其用于计费或其他敏感操作.

在上述两个模块中,您可以使用自己的会话存储覆盖默认值.

Redis会话商店

我通常将会话数据存储在像redis这样的数据库中.

表达

这可以通过connect-redis等模块轻松连接到express .

引用自述文件:

var session = require('express-session');
var RedisStore = require('connect-redis')(session);

app.use(session({
    store: new RedisStore(options),
    secret: 'keyboard cat'
}));
Run Code Online (Sandbox Code Playgroud)

KoaJS

使用red来存储会话数据也可以在koa中使用koa-redis模块.从自述文件中解释:

var app require('koa')();
var session = require('koa-generic-session');
var redisStore = require('koa-redis');

app.keys = ['keys', 'keykeys'];

app.use(session({
  store: redisStore()
}));

app.use(function *() {
  this.session.name = 'koa-redis';
});
Run Code Online (Sandbox Code Playgroud)

没有数据库会话存储

表达

Express可以使用cookie会话扩展将会话数据存储在cookie中.

兴亚

如前所述,koa-session模块默认在cookie中存储会话.