Express-Session中的对象方法

时间:2016-04-04 15:31:39

标签: javascript node.js express express-session

目前我正在尝试将对象与快速会话相关联 有我的代码:

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

// I have an object named "engine", which is a fake SQL Object connection (for example)
// this is my engineFactory (which return an engine when function "giveMeObject" is called).
var engineFactory = require('./tools/engineFactory');
var eF = new engineFactory();

// create my app
var port = 3030;
var app = express();

app.use(session({
    secret: "secret"
}));

app.get('/', function(req, res) {
    // Req.session.engine will contains an SQL connection
    req.session.engine = eF.giveMeObject();
    res.send('object gived : ' + req.session.engine); // return "object gived : [object Object]", so ok.
});

app.get('/session', function(req, res) {
    // Here I verify if my engine still exists
    res.send("Coming From Session: " + req.session.engine); // return "Coming From Session: [object Object]" so, ok.
});

app.get('/session-test', function(req, res) {
    // Here I 
    res.send(Object.getOwnPropertyNames(req.session.engine)); // return ["attributeA","attributeB"], so where is my connectMe() ?
    req.session.engine.connectMe(); // error : "req.session.engine.connectMe is not a function"
});

app.listen(port);
console.log('app listen to ' + port);

所以,我的问题是,我想将一个对象链接到一个会话(通常是一个SQL连接对象)。并重复使用这个对象"无处不在"执行查询等 但是当我尝试使用我的功能时,我有以下错误信息:
" req.session.engine.connectMe不是一个功能"

仅供参考,我的引擎对象和引擎工厂代码:
引擎

function engine(){
    this.attributeA = "aaa";
    this.attributeB = "bbb";
};

engine.prototype.connectMe = function(){
    return this.attributeA + this.attributeB;
};

module.exports = engine;

EngineFactory

var engine = require('./engine');

function engineFactory() {

};

engineFactory.prototype.giveMeObject = function() {
    return new engine;
};

module.exports = engineFactory;

正如我所说,目标是将SQL连接与用户会话相关联。连接被提供给用户,然后,应用程序重新使用用户的连接来向数据库询问查询(关于这一点,我知道池连接模式更好,但这是此项目的要求出于很多原因) 但目前我无法重复使用该对象的方法......

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

大多数后备会话存储不能/不能序列化复杂类型,如函数。许多商店只会在会话数据上调用JSON.stringify()并按原样存储,这将隐式删除函数和其他复杂类型,或者将它们转换为其他类型,例如普通对象或字符串(取决于关于对象上.toJSON() / .toString()的可用性。

您需要重新创建engine实例才能访问函数和其他非可序列化类型。