2016-04-04 16 views
0

當前我正嘗試將對象與快速會話鏈接。
有我的代碼: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連接與用戶會話鏈接起來。連接被授予用戶,然後,應用程序重新使用用戶的連接來詢問數據庫(關於這一點,我知道池連接pattenr更好,但這是項目的一個要求,原因很多) 。
但目前我無法重新使用該對象的方法...

感謝您的幫助。

回答

1

大多數後備會話存儲不能/不會像函數那樣序列化複雜類型。許多商店將簡單地在會話數據上調用JSON.stringify()並按原樣存儲,這會隱式地移除函數和其他複雜類型,或者將它們轉換爲其他類型,如普通對象或字符串(取決於可用性對象上的.toJSON()/.toString())。

您需要重新創建engine實例才能訪問函數和其他不可序列化的類型。

+0

好吧,它現在有道理......所以,我會嘗試另一種方式。感謝您的寶貴幫助mscdex!你爲我節省了很多時間! – Aethyn