【问题标题】:Object #<Object> has no method 'resetMaxAge' NodeJSObject #<Object> 没有方法 'resetMaxAge' NodeJS
【发布时间】:2014-08-26 00:23:17
【问题描述】:

我有一个奇怪的问题,不知道发生了什么... 我尝试将 connect-mongo 与 express-session 一起使用,但它不起作用。 我所做的... 我创建了看起来像这样的 server.js 文件

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

function Start() {

    var app = express();

    // Include views
    app.engine('ejs', require('ejs-locals'));
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');

    // Include vendor lib's
    app.use(express.static(path.join(__dirname, '../public')));
    app.use("/public", express.static(path.join(__dirname, '../public')));
    app.use(express.static(path.join(__dirname, 'public')));

    app.use(favicon('public/favicon.ico'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded());
    app.use(cookieParser());

    //It's a connection to DB. I wait until the connection is established and create global DB object.
    require('./db')(function(err) {
        if (err) {
            log.crit('DB connection error!');
            throw err;
        } else {

                // After connection established i use session.
                app.use(session({
                    secret: config.get('session:secret'),
                    key: config.get('session:key'),
                    cookie: {
                        path: "/",
                        httpOnly  : true,
                        maxAge    : null
                    },
                    store: new MongoStore({mongoose_connection: DB.MONGO.connection}),
                    resave: true,
                    saveUninitialized: true
                }));

                // And after i use routes.
                var routes = require('./routes')(express);
                app.use(routes);

                app.listen(port, ipaddress, function() {
                    log.notice('Node server started on ' + [ipaddress, port].join(':'));

                    cron.dbSync(function(err, cj) {
                        ...
                    });

                });
            }
        });

    };

对于数据库连接,我使用猫鼬。并且 DB.MONGO 包含了 mongoose 对象。

好的。我运行 server.js,一切正常,路由、数据库访问、渲染......但是当我尝试使用 req.session 时出现错误

/node_modules/express-session/index.js:259
      req.session.resetMaxAge();
                  ^
TypeError: Object #<Object> has no method 'resetMaxAge'
    at ServerResponse.end (/node_modules/express-session/index.js:259:19)
    at ServerResponse.res.redirect (/node_modules/express/lib/response.js:724:8)
    at Promise.<anonymous> (/routes/adminpanel/login.js:28:21)
    at Promise.<anonymous> (/node_modules/mpromise/lib/promise.js:177:8)
    at Promise.emit (events.js:95:17)
    at Promise.emit (/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.fulfill (/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
    at /Users/arthurbortnik/GitHub/GMX/node_modules/mongoose/lib/query.js:1393:13
    at model.Document.init (/node_modules/mongoose/lib/document.js:250:11)
    at completeOne (/node_modules/mongoose/lib/query.js:1391:10)

我花了很多时间修复问题,发现是在我尝试运行res.redirect('/adminpanel/stocks/all')后出现的;

          if (admin.isConfirmed && admin.checkPassword(req.body.password)) {

                req.session = {
                    adminpanel: {
                        admin   : admin,
                        auth    : true
                    }
                };

                console.log(req.session);

                res.redirect('/adminpanel/stocks/all');
            }

谁知道发生了什么?

问候,亚瑟·博格。

【问题讨论】:

    标签: node.js mongodb session express


    【解决方案1】:

    当你这样做时,你正在覆盖你的会话对象:

    req.session = {
      adminpanel: {
        admin   : admin,
        auth    : true
      }
    };
    

    我不确定您要在这里实现什么,但这是您丢失Express 使用的实际会话对象的地方。 Doug Wilson 的回复中在 github 上发布了一个类似的问题。

    https://github.com/expressjs/session/issues/82

    这是您自己的应用程序中的一个错误——您或您正在使用的某个模块是 覆盖 req.session (即做一个 req.session = {} 或其他东西)。 此模块不支持覆盖 req.session,因为 req.session 需要是具有某些属性的对象。

    【讨论】:

    • 不知道为什么没想到。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2015-06-09
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2015-05-08
    相关资源
    最近更新 更多