2016-04-04 18 views
0

Derzeit versuche ich, ein Objekt mit einer Express-Sitzung zu verknüpfen. mein Code
Es gibt:Objektmethode in Express-Sitzung

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); 

mein Problem ist also, verbinde ich ein Objekt in eine Sitzung will (in der Regel eines SQL-Verbindungsobjekt). Und Weiterverwendung dieses Objekt „überall“ Abfragen auszuführen, usw. Aber wenn ich versuche, meine Funktion zu verwenden, habe ich die folgende Fehlermeldung:
„req.session.engine.connectMe ist keine Funktion“

nur zur Information, mein Motor-Objekt, und der Motor Werkscode:
Motor

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; 

Wie gesagt, das Ziel ist es, eine SQL-Verbindung mit einer Benutzersitzung zu verknüpfen. Die Verbindung wird dem Benutzer gegeben, dann verwendet die App die Verbindung des Benutzers, um Abfragen an die Datenbank zu stellen (darüber weiß ich, dass das Poolverbindungspattern besser ist, aber dies ist aus vielen Gründen eine Voraussetzung für dieses Projekt) .
Aber zur Zeit kann ich die Methode des Objekts nicht wiederverwenden ...

Danke für die Hilfe.

Antwort

1

Die meisten Backupsitzungsspeicher können komplexe Typen wie Funktionen nicht serialisieren. Viele Filialen rufen einfach JSON.stringify() für die Sitzungsdaten auf und speichern diese unverändert. Dadurch werden Funktionen und andere komplexe Typen entweder implizit entfernt oder sie werden in einen anderen Typ konvertiert, z. B. ein einfaches Objekt oder eine Zeichenfolge (abhängig von der Verfügbarkeit von .toJSON()/.toString() auf den Objekten).

Sie müssen die engine Instanz neu erstellen, um auf Funktionen und andere nicht serialisierbare Typen zugreifen zu können.

+0

Ok, es macht jetzt Sinn ... Also, ich werde einen anderen Weg versuchen. Danke für deine wertvolle Hilfe mscdex! Du hast mich viel Zeit gerettet! – Aethyn

Verwandte Themen