Express-Session 中的对象方法
Object method in Express-Session
目前我正在尝试 link 具有快速会话的对象。
这是我的代码:
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);
所以,我的问题是,我想要 link 会话对象(通常是 SQL 连接对象)。并重新使用此对象 "everywhere" 来执行查询等。
但是当我尝试使用我的函数时,出现以下错误消息:
"req.session.engine.connectMe is not a function"
仅供参考,我的引擎对象和引擎工厂代码:
引擎
function engine(){
this.attributeA = "aaa";
this.attributeB = "bbb";
};
engine.prototype.connectMe = function(){
return this.attributeA + this.attributeB;
};
module.exports = engine;
引擎工厂
var engine = require('./engine');
function engineFactory() {
};
engineFactory.prototype.giveMeObject = function() {
return new engine;
};
module.exports = engineFactory;
正如我所说,目标是 link 与用户会话的 SQL 连接。将连接提供给用户,然后应用程序重新使用用户的连接来查询数据库(关于这一点,我知道池连接模式更好,但出于多种原因这是该项目的要求) .
但是目前我不能重新使用对象的方法...
感谢您的帮助。
大多数支持会话存储 cannot/do 不序列化函数等复杂类型。许多商店将简单地调用 JSON.stringify()
会话数据并按原样存储,这将隐式删除函数和其他复杂类型,或者将它们转换为其他类型,例如普通对象或字符串(取决于关于对象 .toJSON()
/.toString()
的可用性)。
您需要重新创建 engine
实例才能访问函数和其他不可序列化的类型。
目前我正在尝试 link 具有快速会话的对象。
这是我的代码:
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);
所以,我的问题是,我想要 link 会话对象(通常是 SQL 连接对象)。并重新使用此对象 "everywhere" 来执行查询等。
但是当我尝试使用我的函数时,出现以下错误消息:
"req.session.engine.connectMe is not a function"
仅供参考,我的引擎对象和引擎工厂代码:
引擎
function engine(){
this.attributeA = "aaa";
this.attributeB = "bbb";
};
engine.prototype.connectMe = function(){
return this.attributeA + this.attributeB;
};
module.exports = engine;
引擎工厂
var engine = require('./engine');
function engineFactory() {
};
engineFactory.prototype.giveMeObject = function() {
return new engine;
};
module.exports = engineFactory;
正如我所说,目标是 link 与用户会话的 SQL 连接。将连接提供给用户,然后应用程序重新使用用户的连接来查询数据库(关于这一点,我知道池连接模式更好,但出于多种原因这是该项目的要求) .
但是目前我不能重新使用对象的方法...
感谢您的帮助。
大多数支持会话存储 cannot/do 不序列化函数等复杂类型。许多商店将简单地调用 JSON.stringify()
会话数据并按原样存储,这将隐式删除函数和其他复杂类型,或者将它们转换为其他类型,例如普通对象或字符串(取决于关于对象 .toJSON()
/.toString()
的可用性)。
您需要重新创建 engine
实例才能访问函数和其他不可序列化的类型。