我确实来自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'});
})
});
}
由于我几乎完成了我的代码,我正在寻找答案,
如果我托管它,每次用户尝试使用该应用时都会续订会话。
如果不是,则问题出现在隐身模式中。如果是的话,如何克服它。
希望我明白这个问题。
答案 0 :(得分:1)
我不清楚您正在测试您的应用程序,但回答您的主要问题,每个用户仍然没有会话,并且不会在任何用户登录时重置。
也就是说,您描述的行为听起来对我不利,因此您的代码中可能存在错误。我没有看到你在你发布的代码中实际安装你的路由的位置,所以很难看到,但我看到有两个常见的问题与新人表达:
1)app.use
订单很重要。因此,如果您在安装会话之前安装路线,您会发现很奇怪。
2)建议在生产中设置会话配置的secure
属性,但会使会话在开发中不起作用,因为开发站点通常不通过https提供。