Node JS中的会话

时间:2013-11-07 05:35:27

标签: javascript php node.js session

如何在Node JS中维护我的SESSIONS?例如,我想使用Node Js在SESSION中存储UserID。我怎么能在Node JS中做到这一点?我也可以在PHP中使用Node JS SESSION吗?

我想要

<?php $_SESSION['user'] = $userId; ?>

在Node Js。

11 个答案:

答案 0 :(得分:13)

  

首次安装会话

npm install express-session --save
  

在服务器页面上初始化会话

var express     =   require('express');

var session     =   require('express-session');

var app         =   express();

app.use(session({secret: 'ssshhhhh',saveUninitialized: true,resave: true}));
  

存储会话

sess=req.session;

var user_id=1;

sess.user_id=user_id;
  

访问会话

sess=req.session;

sess.user_id

答案 1 :(得分:8)

让我将你的问题分成两部分。

 1.如何在Node JS中维护我的SESSIONS?
答案:使用express-session middleware来维护会话

 2.我也可以在PHP中使用Node JS SESSION吗?
答案: 是的,您也可以在PHP中使用该会话,但请记住,您必须将该会话存储在数据库中。

答案 2 :(得分:6)

ExpressJS has official session middleware,它也是Node.js当前事实上的标准Web框架。


如果您希望自己实现会话支持,这就是每次请求时通常执行的方式:

  1. 检查cookie是否包含会话ID
    • 如果没有,请创建一个存储在内存,文件或数据库(或其组合)中的会话对象,并在响应cookie中设置会话ID以匹配此对象的标识符。
    • 如果cookie确实包含会话ID,请按ID找到会话对象。
  2. 将步骤1中获取/创建的对象作为请求的持久会话对象提供。
  3. 您还必须实现一些超时机制,以便在一段时间后删除会话对象,至少从内存中删除。

答案 3 :(得分:3)

您可以使用快速会话中间件。 将它与connect-redis或connect-mongo结合使用可将会话存储在数据库中,并在内存对您有价值时节省内存(如在云设置中)。

https://github.com/expressjs/session

https://www.npmjs.com/package/express-sessions

如果你把它存放在mongodb中,请使用php mongo驱动程序从那里拿起它。

答案 4 :(得分:1)

你自己不需要这样做。 nodeJS中有一些令人惊叹的模块可以为您处理这类事情。

如前所述,您可以使用express中的会话中间件。

但是,我建议您使用passportJS。此模块为您执行身份验证部分,有许多策略可以集成到您的网站中(使用Facebook,Google,Twitter等登录等),并使用serializeUser()自动处理所有会话内容deserializeUser()随时随地发挥作用。

您可以在会话部分http://passportjs.org/docs/configure

中查看此处

答案 5 :(得分:0)

要保持会话现在已经过时你应该尝试使用JWT token,这非常有效且容易。但仍然要在Node js中维护会话:

在快速配置中

var cookieParser = require('cookie-parser');
var session = require('express-session');

app.use(cookieParser());
    app.use(session({
        secret: 'secret',
        resave: true,
        saveUninitialized: true,
        rolling: true,
        cookie: {
            path: '/',
            maxAge: 60000 * 1000
        },
        name: 'SID'
    }));

登录后存储会话:

var session = req.session;
    if (user) {
        session.user = user._id;
        session.save();
        console.log(session);
    }

从中间件检查会话:

var session = req.session;
            if (session.user) {
                req.userid = session.user;
                next();
            } else {
                return res.status(401).send({
                    code: 401,
                    message: Constant.authentication_fails
                });
            }

希望你能清楚了解会话。

答案 6 :(得分:0)

允许访问/允许查看用户区域的会话,它也是一个凭证,因此我们可以在应用程序上使用它。我使用jsonwebtoken制作了一个令牌,该令牌将在用户成功登录后随时间显示用户的详细信息。我将其存储在redis中,可以用于预先声明的时间限制。

答案 7 :(得分:0)

执行以下步骤:

1. npm install express-session --save
2. Write below code:
    var express = require('express');
    var session = require('express-session');
    var app = express();
    app.use(session({secret: 'your secret key', saveUninitialized: true, resave: true}));
    var userId = 1234;
    app.get('/', function (req, res, next) {
        req.session.userId = userId;
    }); 

答案 8 :(得分:0)

在NODE JS中存储会话非常简单,但是您需要了解它的步骤,可以手动处理,也可以使用几个NPM模块。 Passport可以帮助您进行身份验证以及登录和存储会话,我建议您阅读其文档,Passport允许您使用其他类似Google,github的其他平台对用户进行身份验证。

如果您要使用护照,请在NPM模块下面使用这些密码

  1. 护照
  2. 本地护照
  3. Express-flash
  4. 快速会话

2-将这些模块导入您的主app.js

    const flash = require('express-flash')
    const session = require('express-session')
    const passport = require('passport')
    app.use(session({
    secret:'secret',
    resave:false,
    saveUninitialized:false
    }))

   app.use(flash())
   app.use(passport.initialize())
   app.use(passport.session())

3-创建passport.js文件,您可以命名任何东西,因此这背后的基本理解是,您必须检查来自输入表单的有效用户,如果有效,则必须将电子邮件ID与模型进行比较输入密码,然后返回用户。完成后,序列化和反序列化您的用户以存储在会话中。 我建议检查文档中的这一部分以获得更清晰的理解。 http://www.passportjs.org/docs/downloads/html/

const localStretgy = require('passport-local').Strategy
const bycrypt = require('bcrypt')
const User = require('../model/User')

const initalize = function(passport){
const auth = async(email,password,done)=>{
   try {
      const user = await User.findOne({email:email})

      if(!user){
         throw new Error("Incorrect Email ..!")
      }   
      const match = await bycrypt.compare(password,user.password)

         if(!match){
         throw new Error('Incorrect Password..!')
      }

     return done(null,user)
   } catch (error) {
      console.log(error)
      done(null,false,error)
   }


}


passport.use(new localStretgy({usernameField:'email'},auth))

passport.serializeUser(function(user, done) {
   done(null, user.id);
 });

 passport.deserializeUser(function(id, done) {
   User.findById(id, function(err, user) {
     done(err, user);
   });
 });

}

module.exports = initalize
  1. 现在转到您的登录路由器,使用以下代码

    常量护照= require('passport')

        require('../passport/passport')(passport)
    
        routes.get('/signin',(req,res)=>{
          res.render('signin',{
            pageTitle:'sign in'
          })
        })
        routes.post('/signin',passport.authenticate('local',{
          successRedirect:'/welcome',
          failureRedirect:'/',
          failureFlash:true  
        }))
    

答案 9 :(得分:0)

您可以通过使用 node js 中的 'express-session' 包在 node js 中使用 session。 你必须在你的应用程序中安装 express 和 express-session

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

"secret" 用于 cookie,我们必须添加一些秘密来管理会话。 “请求”我们使用请求变量,就像我们在 PHP 中使用 $_SESSION 一样。

var sess;
app.get('/',function(req,res){ // get request from app side
sess=req.session;
sess.email; // equivalent to $_SESSION['email'] in PHP.
sess.username; // equivalent to $_SESSION['username'] in PHP.
});

如果您想详细了解节点 JS 中的会话,请参阅 Code for Geek 中有关节点 JS 中会话的完整文档。

答案 10 :(得分:-1)

您可以双向处理会话。

  1. 使用快递会话
  2. 使用JWT Web令牌并处理自己的会话(基于令牌的会话处理)。
  3. 我认为基于令牌的会话处理比使用快速会话更重要。扩展服务器时会出现问题,而单个设备登录情况也会出现问题。

    For Checking我有Token Based Session Hanling node js文件夹结构。你可以查看。 这可能会有所帮助