关于NodeJS 的Session模块-一应用Express

NodeJS开发指南——mongoDB、Session 记录一下这两天用nodeJS搭建一个博客系统遇到的坑;关于mongoDB数据库的连接db.jsvar settings = require('../settings'); var mongo = require('mongodb');var Server=mongo.Server; var Db=mongo.Db; var server = new Server('localhost', 27017 阅读详情

首先呢这是一篇翻译或来的文章,文章内容讲的很详实,比国内文章强一些。英语水平有限,错误之处还需订正,希望对大家有些帮助,

Using sessions to keep track of users as they journey through your site is key to any respectable application. Luckily, as usual, using Express with your Node.js application makes it super simple to get sessions up and running.

使用Session是我们在追踪用户在他们使用应用程序的时候我们能够准确掌握其操作的关键。幸运的是,像往常一样,在Node.js之中套用框架Express(点击打开链接)能够让我们超级简单的操作Session和运行程序。

Express App

Before we do anything else, we need an Express application. Creating an Express app is extremely simple, and the makers of Express do a pretty good job documenting the process.

在我们做任何事情之前,我们需要一个Express的应用程序。创建一个express应用程序是极其简单的。而且Express框架的作者为该框架已经为我们学习该框架准备了丰富的文档和学习指南,一下是Express的一个示例:

package.json

{
  "name": "SessionsExample",
  "version": "0.0.1",
  "dependencies": {
    "express": "3.x"
  }
}

app.js

var express = require('express');
var app = express();

app.get('/awesome', function(req, res) {
  res.send("You're Awesome.");
});

app.get('/radical', function(req, res) {
  res.send('What a radical visit!');
});

app.get('/tubular', function(req, res) {
  res.send('Are you a surfer?');
});

//If you host the application on Modulus the PORT environment variable will be defined,
//otherwise I’m simply using 8080.
app.listen(process.env.PORT || 8080);

Now we have three routes defined and available to visit. If you visit one page, it's like you are visiting it for the first time. However, what if we wanted to remember the last page someone visited? We can easily do that with sessions.

现在我们已经定义了三个路由并能够访问,假如你想访问其中一个页面,就像其他第一次访问页面一样。然而,我们想记住最后一次访问的页面该怎么办?我们可以使用Session很简单的解决该问题。

Remembering Things

Before we dive in, there is a little bit of setup necessary. We need to “use” the cookie parser and the session features of express before the sessions will be made available. You do this before you define any routes, which in our case would look like so:

在我们使用Session时,我们需要做一些必须的工作,我们需要使用"use"方法去定义中间件cookieParser和Sesion遮掩才能正确使用Express提供的Session功能。你必须在你定义路由之前做那些工作。下面使我们写完成的例子:

app.js

var express = require('express');
var app = express();

app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));

app.get('/awesome', function(req, res) {
  res.send('Your Awesome.');
});

app.get('/radical', function(req, res) {
  res.send('What a radical visit!');
});

app.get('/tubular', function(req, res) {
  res.send('Are you a surfer?');
});

app.listen(process.env.PORT || 8080);

Since sessions use cookies to keep track users we need both the cookie parser and the session framework. It is important to note that the cookie parser is used before the session, this order is required for sessions to work.

既然sessions使用cookies去追踪用户,那这样我们需要cookieparser和session框架,这非常重要在我们使用session让其工作之前要先去定义cookieparser。

We also provide a secret to the session initializer, which provides a little more security for our session data. Of course you might what to use a key that is a little more secure.

我们也提供了一个加密秘钥在我们session初始化的时候,让其为我们的session数据提供一些安全,当然,你也可以使用一个秘钥来保证一定的安全性。

Sessions are accessible through the request object in each route. You can get and set properties just like you would when handling an object normally. For example, lets set some session data in the awesome route.

Session是可以在每一个路由请求通过request对象能够轻易地获取。你能够像你处理普通对象那样来获取和设置session里面的属性内容。

例如,让我们在“/awesome”的路由请求中设置一些session数据

app.get('/awesome', function(req, res) {
  req.session.lastPage = '/awesome';
  res.send('Your Awesome.');
});

It really is as easy as accessing the session object in the request. Let’s say we want to print the last page the user visited as well.

app.get('/awesome', function(req, res) {
 if(req.session.lastPage) {
   res.write('Last page was: ' + req.session.lastPage + '. ');
 }

 req.session.lastPage = '/awesome';
 res.send('Your Awesome.');
});

Lastly we can apply this to the rest of the routes.

var express = require('express');
var app = express();

app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));

app.get('/awesome', function(req, res) {
  if(req.session.lastPage) {
    res.write('Last page was: ' + req.session.lastPage + '. ');
  }

  req.session.lastPage = '/awesome';
  res.send('Your Awesome.');
});

app.get('/radical', function(req, res) {
  if(req.session.lastPage) {
    res.write('Last page was: ' + req.session.lastPage + '. ');
  }

  req.session.lastPage = '/radical';
  res.send('What a radical visit!');
});

app.get('/tubular', function(req, res) {
  if(req.session.lastPage) {
    res.write('Last page was: ' + req.session.lastPage + '. ');
  }

  req.session.lastPage = '/tubular';
  res.send('Are you a surfer?');
});

app.listen(process.env.PORT || 8080);

And there it is, a session enabled application.

ok,就是这样,一个session可用的应用程序

Using Redis

There is only one major issue with our sessions. Anytime we restart our app, all of the user sessions are lost. I think we can all agree this presents a problem with our updating process.

现在只有一个很严重的问题。那就是无论何时我们重启程序,所有用户的session数据都会丢失,我认为我们完全认同在进步过程中这个目前的难题。

There are several ways around this problem, but one of the best ways is to use an external store for the session data. More specifically, we can use a Redis store. This way the session data is completely separate from our running application.

关于这个难题有好几种解决方式,但是其中最好的一个方式是为session数据使用扩展的存储方式。更好的方式是,我们可以使用一个Redis 存储,使用这种方式我们完全可以将session数据存储和应用程序本身分割开来,而不依赖与浏览器等宿主环境。

To set up Redis with Express sessions, we need an extra module. This module is the Redis client used by connect and helps create a streamlined solution for connecting Redis to Express. First we have to make sure its in our package.json.

为了在Express session中设置Redius,我们需要额外的模块,这个模块是通过Redis客户端进行联系的而且帮助创建一个为连接Redis和Express的最新型的解决方案。首先第一格我们需要设置一下我们的package.json文件

package.json

{
  "name": "SessionsExample",
  "version": "0.0.1",
  "dependencies": {
    "express": "3.x",
    "connect-redis": "1.4.x"
  }
}

Then we have to require it.(包含进来文件)

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

app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));

//...

Notice that we pass Express to the Redis connector. This is required for Express and the Redis store to play nice with each other, which makes the process a whole lot easier later.

注意我们传递了Express对象给了Redis 连接。这是为了使Express和Redis两者能够后互相协调的工作,这个使得整个过程更加的容易。

In order to set up the Redis store with our sessions, we are going to modify our app.use call. The session initializer not only takes a secret, but a store as well. As you can probably guess, this is used to tell the session manager where to put all the session data. All we have to do is pass in an object it can use instead of its native storage.

为了建立Redis来存储我们的session。我们需要改变我们的调用方式。这个session初始化不仅仅是设置一个secret,而且也是初始化了存储模块。这样你可能才想到,这个是用来告诉session管理模块应该把这些session数据存放在哪个地方。仅需要我们所做的是传递一个对象来代替我们本地存储

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

app.use(express.cookieParser());
app.use(express.session({
  store: new RedisStore({
    host: 'localhost',
    port: 6379,
    db: 2,
    pass: 'RedisPASS'
  }),
  secret: '1234567890QWERTY'
}));

//...

It’s as simple as that. The RedisStore constructor can take all the normal options you would expect. In this case we are going to use database 2 with the password we use to authenticate with our Redis instance.

看起来如此简单。这个RedisStore构造函数可以设置所有的你所希望设置的值。在这种情况下,我们可以我们可以使用数据库2并捎带着权限的密码在我们的Redis实例中。

Now all of our session data will stored safely in our Redis database. This also means that any time we restart our node application, the session data is immune from being reset because it is not stored under the same process as our application.

现在所有的我们的session数据可以安全的存储在Redis数据库里,这个也意味着我们可以在任何时候启动我们的node应用程序是的时候,这些session数据也不会被重置。这是因为他没有被存储在我们的程序进程之中。

What about Mongo?

So some of you out there might be wondering if you can use MongoDB to store your session data. Well, using Mongo in place of Redis in our previous example is actually just as simple as using Redis. Instead of connect-redis you just use, you guessed it,connect-mongo.

这里面的我们很多会为什么不用M哦你goDB来存储我们的session数据,好吧,使用Mongo来代替Redis是我们的上一个例子其结果两者是一样的简单,两者使用可以根据需要来选择。

package.json

{
  "name" : "SessionsExample",
  "version" : "0.0.1",
  "dependencies" : {
    "express" : "3.x",
    "connect-mongo" : "0.3.x"
  }
}

Just add a few “Mongo”s where you see “Redis” and it all falls into place.

var express = require('express');
var app = express();
var MongoStore = require('connect-mongo')(express);

app.use(express.cookieParser());
app.use(express.session({
  store: new MongoStore({
    url: 'mongodb://root:myPassword@mongo.onmodulus.net:27017/3xam9l3'
  }),
  secret: '1234567890QWERTY'
}));

//...

It is honestly that simple. Of course there are a lot more options you have when creating your MongoStore instance, but the example above gets you the basic functionality and will start storing your session data in your Mongo database.

So there are the basics behind Express sessions. As you can see, it is not complicated, and just requires a little setup to get rolling. Don’t forget, if you have any questions or comments, throw them out below. We are never afraid of feedback.

(express-session踩坑)NodeJS后台接口-邮箱验证码验证注册功能实现 下载express-session,nodemailer npm i -s express-session // express的中间件 npm i -s nodemailer // 邮箱验证插件 配置方法在官网可以看 下面的代码也有现成的 在app.js下引入express-session var session = require('express-session'); // 配置... 阅读详情

相关推荐

express如何解决ajax跨域访问session失效问题详解

前言 最近在学习express,就用以前做的项目来进行express前后端分离的练手了,在做登陆注册的时候发现跨域的时候,session的值是会失效的,导致session里面的数据获取为undefined,网上找资料加上自己的不断尝试,终于找到了解决方法,简单记录一下解决方法。 解决方法 1、客户端因为session原则上是需要cookie支持的,所以Ajax方法里面必须添加 xhrFields:{withCredentials:true},表示允许带Cookie的跨域Ajax请求( 特别说明,只要使用的session都得加这句) $('#login').click(function (

nodeJS学习之旅-----session的使用,cookie,webstorage的理解

一,session简介 session是另一种记录客户状态的机制,cookie保存在客户端,session保存在服务器 session运行在服务器,客户端第一次访问服务器时,就可以将客户的登录信息保存。 当客户访问其他界面时,可以判断客户的登录状态,做出提示,相当于登录拦截。 session可以和Redis或者数据库等结合做持久化操作,当服务器挂掉可不会导致信息丢...

纯净天空 5544

iframe跨域与session失效问题的解决办法

主要介绍了iframe跨域与session失效问题的解决办法,有需要的朋友可以参考一下

认识node和node里面的(cookie、session、localStorage、sessionStorage)之间的区别

1、认识node 在node中每一个JS文件都是一个模块 在node中没有window大对象,里面只有一个global,global是node中的一个全局大对象 在node中有两个是输出路径的(__dirname和__filename),__dirname会默认输出当前文件的父级文件夹的绝对路径;而__filename会输出当前文件的绝对路径。 node还有一个require方法,用于导入模块...

Future_Love的博客 1614

Cursor AI对话历史丢失?开源工具一键恢复项目聊天记录

在软件开发中,数据持久化与工作区管理是保障开发效率与上下文连续性的基础技术。其核心原理在于通过文件系统路径、数据库存储等机制,将应用状态与用户数据持久化关联。对于依赖AI辅助编程的开发者而言,对话历史是宝贵的项目上下文资产,记录了关键的算法思路、API使用范例和问题解决方案。然而,当开发工具(如基于VS Code的Cursor)采用基于项目绝对路径的工作区隔离机制时,项目路径的变更会导致历史对话看似“丢失”,实则是被隔离在了旧路径对应的数据沙箱中。这直接影响了开发体验与知识沉淀的效率。cursor-chat

weixin_26775679的博客 828

单片机控制双向可控硅的5种实用触发电路设计(附完整电路图)

本文深入解析了单片机控制双向可控硅的5种实用触发电路设计,涵盖从基础隔离到复杂负载驱动的实战方案。重点探讨了光电耦合器选型、过零检测同步、RC吸收电路精密计算以及应对感性负载和高噪声环境的加固策略,并提供了完整的电路图与调试避坑指南,旨在帮助开发者实现安全可靠的交流负载控制。

joy55的博客 2209

【Node.js】Session 中间件的使用详解

Session(会话)是一种服务器端的存储方式,用于保存用户的状态和信息,通常用于身份验证和跨多个请求共享数据。在 Web 应用中,HTTP 协议是无状态的,服务器无法跟踪用户的行为和状态。通过 session,服务器可以在不同的请求之间识别同一用户,并保存用户的登录状态、购物车信息等。Session 中间件是 Node.js Web 应用中不可或缺的一部分,特别是在处理身份验证和状态管理时,它能够提供简洁而高效的解决方案。

lph159的博客 1724

Ubuntu更新后VirtualBox报错rc=-1908?手把手教你修复Kernel driver not installed

本文详细解析了Ubuntu更新后VirtualBox报错rc=-1908的原因,并提供了完整的修复方案。通过重新安装VirtualBox、处理DKMS内核模块以及解决Secure Boot问题,帮助用户快速恢复虚拟机功能。特别针对Kernel driver not installed错误,给出了从诊断到修复的详细步骤。

weixin_42519781的博客 339

Web Storage API:localStorage(持久化存储,除非手动删除)、sessionStorage(会话级存储,标签页关闭即清除)

简单说:虽然5MB看似不大,但若无策略地使用,很容易在关键时刻面临存储不足问题,尤其在复杂应用中。主动管理存储是良好的开发实践。Web Storage API提供了简单高效的客户端存储解决方案,localStorage适合持久化数据存储,sessionStorage适合会话级临时数据存储。合理利用这两种机制,可以构建更具响应性和弹性的Web应用,提升用户体验。在实际应用中,应当注意安全限制、性能优化以及数据管理策略,以充分发挥Web Storage的优势。

Dontla的博客 2303

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5091

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2247

nodejs学习cookie和session

1、cookie     在浏览器保存一些数据,每次向服务器发起请求是都携带                不安全,用户可以修改                大小为4k2、session    与cookie作用一致,用来保存一些数据,只是保存在服务端,                相对安全,用户不可修改,基于cookie实现                    session_id 存放在...

zhangkainumber的博客 855

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-L !!! 最新的发文热点

Vision Clue Merge模块在Mamba - YOLO模型中同样重要,主要负责在模型的下采样过程中处理特征图,为后续的特征融合和目标检测任务提供更有效的信息。

Limiiiing的博客 472

nodejs fs http express express-session jwt mysql mongoose

console.log("我是m1模块");return a+b;return 1;const uname= "我是妹妹";// 暴露模块,最终共享的结果以module.exports为准sum,uname,sayHello// module.exports.uname = "我是妹妹";// 解析表单数据的中间件})next();})})});});/*** string() 值必须是字符串。

疯狂的毛毛虫-一个java后端爱好者 1285

QTI Camera Stack 中的多摄调度模型与 SyncGroup 实现机制详解

在当前高端移动影像系统中,搭载主摄、长焦、超广、ToF、IR 等多个图像模组已成标配,实现高效、低延迟、高稳定性地调度这些 Sensor 的图像能力成为 QTI Camera Stack 架构的关键组成。高通平台通过构建 Camera SyncGroup 模型与多层调度策略,在 ISP 层实现多模组图像流的绑定控制、帧级时间同步、主副摄无感切换、双路并发采集等能力。 本文基于 Snapdragon 8 Gen 系列平台的实际调测经验,系统解析 Camera Stack 中多摄调度模型的结构设计、各层模块职责

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1055

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 141

Node跨域cors模块,nodejs+express跨域

Node跨域cors模块 NodeJS+Express跨域 什么是CORS CORS(Cross-origin resource sharing),跨域资源共享,是一份浏览器技术的规范,用来避开浏览器的同源策略 简单来说就是解决跨域问题的除了jsonp外的另一种方法 安装cors模块 使用express写的接口,只能在内部使用,如果想要外部的服务访问,就涉及到了跨域。但是又不...

YunWisdom 2711

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

nodejs Express 中session使用

目前手上一个项目使用 Nodejs 的Express框架,想通过session实现有关登录功能。 1: 配置session      存储使用 session-mongoose,具体配置如下:     var sessionMongoose = require("session-mongoose"); var sessionStore = new sessionMongoo

淡水鱼 的专栏 2907

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

nodejs——在Express中使用Session认证

为了解析JSON格式的请求体和解析表单格式的请求体我们需要编写以下代码。如果不添加以上代码我们使用Apifox进行测试时会在终端报以下错误。(注意在使用Apifox测试之前要先在终端运行代码)我们使用Apifox进行测试以下是测试成功的截图。命令来安装express-session中间件。然后配置express-session中间件。命令下载cors然后编写以下代码进行导入。为了解决跨域问题我们需要使用。向session中存数据。从session中取数据。

m0_74220769的博客 459

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

nodejs + express + express-session + redis

nodejs + express + express-session + redis 标题似乎又是不太对,大家领会精神哈 Express 安装express-generator,然后用它来创建一个工程; npm install express-generator -g express myApp cd myApp npm install npm start 或是 no...

amnwk2952的博客 401

nodejs模块学习: express-session 解析

作者:@htoooth 本文为作者原创,转载请注明出处:http://www.cnblogs.com/htoooth/p/7340628.html 目录 引言 session session 是什么 session 生命周期 session 特点 session 技术方案 session 使用流程 express-session 的分析 express-sessi

humor456的博客 751

nodejs express

自己手动开发中间件处理数据,例如模拟express.urlencoded这样的中间件,来解析提交POST提交到服务器的表单数据})next()})})})})为了优化代码结构,可以把自定义的中间件函数,封装为独立的模块,然后提供导入模块进行使用//模块内(09.js)})next()})//app.js})})

2301_80295166的博客 1099

在nodejs express 中使用session的功能

var express = require('express'),     routes = require('./routes'),     user = require('./routes/user'),     http = require('http'),     path = require('path');  var app = express();  // all env

wuyajun1124的专栏 1109

nodejs+express的session使用

今天终于使用nodejs+redis把网页版即时聊天框架zenkim搭了起来,非常简陋,不过登录/用户管理/实时消息推送/消息缓存/用户单实例登录控制deng基本能力都有,待完成的功能包括:消息持久化及活动用户队列周期扫描/加强事务能力/消息排序/界面美化/移动版本支持。再优化一下后放到github上。   今天花了一下午时间,都用在了处理session上。nodejs本身不管session...

juzejian的专栏 898

nodejs项目实战教程15—Express

nodejs项目实战教程13—Expres1. Express操作路由(get、post、put、delete、多级目录、动态路由、get传值)1.1 安装Express1.2 get用于显示数据1.3 post用于增加数据1.4 put主要用于修改数据1.5 delete主要用于删除数据1.6 路由配置多级目录1.7 动态路由1.8 获取get传值2. Express 使用ejs2.1 安装ejs2.2 使用ejs2.3 在ejs中使用javascript2.4 在ejs中引用其他ejs文件作为公共模块2

qq_39055970的博客 2329
上一篇: 推荐20个优秀的网页色彩搭配实例
下一篇: chrome浏览器Uncaught TypeError: object is not a function问题解决
轻鸿飘羽
博客等级 码龄16年 124粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值