节点JS会话设置

时间:2017-12-30 08:20:10

标签: node.js session

我确实来自php背景,如果我设置会话,它将特定于用户。所以在开发过程中我可以充当两个用户,在正常模式和隐身模式下打开应用程序,并验证服务器和数据库更新之间的通信。

现在我正在使用Nodejs开发一个应用程序。要么我误解了PHP会话的快速会话,要么我没有正确配置它。如果我在普通窗口中以用户身份登录并打开隐身窗口,会话将重置。

app.js

    var express = require('express');

var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');

var http = require('http');
var reload = require('reload');

var index = require('./routes/index');
var users = require('./routes/users');
var user = require('./routes/user');
var dashboard = require('./routes/dashboard');
var search = require('./routes/search');
var profile = require('./routes/profile');
var ajax = require('./routes/admin-ajax');
var logout = require('./routes/logout');



var app = express();


app.set('port', process.env.PORT || 3000);

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))

app.use('/', index);
app.use('/users', users);
app.use('/user', user);
app.use('/dashboard', dashboard);
app.use('/search', search);
app.use('/profile', profile);
app.use('/admin-ajax', ajax);
app.use('/logout', logout);




app.use('/js', express.static(__dirname + '/node_modules/bootstrap/dist/js')); // redirect bootstrap JS
app.use('/js', express.static(__dirname + '/node_modules/jquery/dist')); // redirect JS jQuery
app.use('/js', express.static(__dirname + '/node_modules/jquery-ui-dist')); // redirect JS jQuery
app.use('/js', express.static(__dirname + '/node_modules/popper.js/dist/umd')); 
app.use('/js', express.static(__dirname + '/node_modules/moment/min')); 
app.use('/js', express.static(__dirname + '/node_modules/lodash')); 
app.use('/css', express.static(__dirname + '/node_modules/jquery-ui-dist')); // redirect JS jQuery
app.use('/css', express.static(__dirname + '/node_modules/bootstrap/dist/css')); // redirect CSS bootstrap
app.use('/css', express.static(__dirname + '/node_modules/font-awesome/css')); 
app.use('/css', express.static(__dirname + '/node_modules/animate.css')); 

app.use('/js', express.static(__dirname + '/node_modules/datatables.net/js')); 
app.use('/js', express.static(__dirname + '/node_modules/datatables.net-bs4/js')); 
app.use('/css', express.static(__dirname + '/node_modules/datatables.net-bs4/css')); 






// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});


// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});


var server = http.createServer(app)

reload(app);
server.listen(app.get('port'), function () {
 console.log('Web server listening on port ' + app.get('port'))
});





module.exports = app;

登录验证

user.verify_login = (req, res, next)=>{
    let query = {$and:[{mobile:{$eq:req.body.mobile}}, {otp:{$eq:_.toString(req.body.otp)}}]}
    db.connect(function(err, dbconnect){
        if(err)
            return res.status(404).send({message:'Error connecting db'});
        dbconnect.collection('users').findOne(query, function(err, result){
            if(err || _.isEmpty(result))
                return res.send({success:false, message:'Mobile OTP doesnot match'});
            result.success = true;
            req.session.user = result; // I am storing session value here
            return res.send({success:true, redirect:'/dashboard'});
        })
    });
}

由于我几乎完成了我的代码,我正在寻找答案,

  1. 如果我托管它,每次用户尝试使用该应用时都会续订会话。

  2. 如果不是,则问题出现在隐身模式中。如果是的话,如何克服它。

  3. 希望我明白这个问题。

1 个答案:

答案 0 :(得分:1)

我不清楚您正在测试您的应用程序,但回答您的主要问题,每个用户仍然没有会话,并且不会在任何用户登录时重置。

也就是说,您描述的行为听起来对我不利,因此您的代码中可能存在错误。我没有看到你在你发布的代码中实际安装你的路由的位置,所以很难看到,但我看到有两个常见的问题与新人表达:

1)app.use订单很重要。因此,如果您在安装会话之前安装路线,您会发现很奇怪。

2)建议在生产中设置会话配置的secure属性,但会使会话在开发中不起作用,因为开发站点通常不通过https提供。