2016-04-04 9 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

関連する問題