【问题标题】:Node.js - Express session data not persistingNode.js - Express 会话数据不持久
【发布时间】:2019-04-20 09:05:01
【问题描述】:

登录按预期工作并返回会话数据,但除此之外,我无法让会话数据保持不变。例如,当我调用 getUser(如下)时,不会返回会话数据。

app.js(设置)

const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
const morgan = require('morgan')
const request = require('request')
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);

const app = express()
app.use(morgan('combined'))
app.use(bodyParser.json())
app.use(cors({
    credentials: true
}))

const mongodb_conn_module = require('./mongodbConnModule');
var db = mongodb_conn_module.connect();

app.use(session({
    secret: 'work hard',
    resave: false,
    saveUninitialized: true,
    cookie: {
        secure: false,
        maxAge: 24 * 60 * 60 * 1000
    },
    store: new MongoStore({
        mongooseConnection: db,
        ttl: 24 * 60 * 60 // Keeps session open for 1 day
    })
}));

app.js(登录)

app.post('/login', (req, res) => {
    if (req.body.logEmail && req.body.logPassword) {
        Users.authenticate(req.body.logEmail, req.body.logPassword, function (error, user) {
            if (error || !user) {
                var err = new Error('Wrong email or password.');
                err.status = 401;
                res.send("Wrong email or password.");
            } else {
                req.session.userId = user._id;
                res.send({
                    success: true,
                    sessionInfo: req.session
                });
            }
        });
    } else {
        var err = new Error('All fields required.');
        err.status = 400;
        res.send("All fields required.");
    }
})

返回会话数据(userId)

app.js (getUser)

app.get('/get_user', (req, res) => {
    res.send(req.session)
})

这似乎会删除会话数据

UsersService.js(模型)

var mongoose = require("mongoose");
var bcrypt = require('bcrypt');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    userName: {
        type: String,
        unique: true,
        required: true,
        trim: true
    },
    email: {
        type: String,
        unique: true,
        required: true,
        trim: true
    },
    password: {
        type: String,
        required: true,
    },
    passwordConf: {
        type: String,
        required: true,
    }
});

//authenticate input against database
UserSchema.statics.authenticate = function (email, password, callback) {
    Users.findOne({ email: email })
        .exec(function (err, user) {
            if (err) {
                return callback(err)
            } else if (!user) {
                var err = new Error('User not found.');
                err.status = 401;
                return callback(err);
            }
        bcrypt.compare(password, user.password, function (err, result) {
            if (result === true) {
                return callback(null, user);
            } else {
                return callback();
            }
        })
    });
}

// hashing a password before saving it to the database
UserSchema.pre('save', function (next) {
    var user = this;
    bcrypt.hash(user.password, 10, function (err, hash) {
        if (err) {
            return next(err);
        }
        user.password = hash;
        next();
    })
});

var Users = mongoose.model("Users", UserSchema);
module.exports = Users;

提前致谢!

【问题讨论】:

  • 请粘贴 Users.authenticate() 和 Users 模型的代码
  • 确保在路由之前加载会话中间件。
  • @RohanDhar 更新了帖子以包含 users.js 模型
  • @robertklep 我很确定我在路由之前加载我的会话中间件。 app.get('/get_user',... 和 app.get('/login',... 在会话中间件加载后定义。
  • 还可以使用浏览器的开发者工具检查是否在登录后设置了会话 cookie,以及在请求 /get_user 时是否发送了相同的 cookie。

标签: node.js express session express-session


【解决方案1】:

经过大量工作,我刚刚解决了同样的问题,因为 app.js (setup) 中的顺序不好,所以通过此代码编辑 app.js (setup) 希望对您有所帮助:)

const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
const morgan = require('morgan')
const request = require('request')
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);

const app = express()
    app.use(session({
            secret: 'work hard',
            resave: false,
            saveUninitialized: true,
            cookie: {
                secure: false,
                maxAge: 24 * 60 * 60 * 1000
            },
            store: new MongoStore({
                mongooseConnection: db,
                ttl: 24 * 60 * 60 // Keeps session open for 1 day
            })
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({ extended: false }));

    app.use(morgan('combined'))
    app.use(cors({
        credentials: true
    }))
});
app.use(cors({
    credentials: true
}))

const mongodb_conn_module = require('./mongodbConnModule');
var db = mongodb_conn_module.connect();


}));

【讨论】:

  • 我按照您的建议重新订购,但没有成功
猜你喜欢
  • 1970-01-01
  • 2021-09-23
  • 2020-02-12
  • 1970-01-01
  • 2019-03-14
  • 2014-02-22
  • 2012-12-09
  • 2012-11-20
  • 2012-03-17
相关资源
最近更新 更多