这里有什么问题?res.render('/somepage', {user:req.session.user})
它导致将循环结构转换为 JSON 错误,(导致 session 元素具有循环用户引用。)
exports.home = function (req, res) {
var entityFactory = new require('../lib/entity-factory.js').EntityFactory();
entityFactory.get_job_task_lists({
callback : function (err, job_task_lists) {
res.render('home.jade', {
locals:{
title: 'Logged in.',
user:req.session.user, // does not work
job_task_lists:job_task_lists || []
}
});
}
});
};
我添加了一些登录 node_modules/express/node_modules/connect/lib/middleware/session/memory.js
MemoryStore.prototype.set = function(sid, sess, fn){
var self = this;
process.nextTick(function(){
console.log(sess);//这是列出的输出
self.sessions[sid] = JSON.stringify(sess);
...
就结构而言,这就是我期望 session 的样子:
{ lastAccess: 1330979534026,
曲奇饼:
{ 小路: '/',
httpOnly:真,
_expires: 星期二, 06 Mar 2012 00:32:14 GMT,
原始最大年龄:14399999 },
user://这是我添加到 session 中的对象
{ id: 1,
用户名:'管理员',
密码:'8e3f8d3a98481a9073d2ab69f93ce73b',
创建日期:2012 年 3 月 5 日星期一 18:08:55 GMT } }
但这是我发现的:
{ lastAccess: 1330979534079,//新 session
曲奇饼:
{ 小路: '/',
httpOnly:真,
_expires: 星期二, 06 Mar 2012 00:32:14 GMT,
原始最大年龄:14399999 },
用户://但又来了,除了现在是一个混搭,
//包含它不应该拥有的成员,如本地人,
//以及,除了前 4 个属性之外的所有内容
{ id: 1,
用户名:'管理员',
密码:'8e3f8d3a98481a9073d2ab69f93ce73b',
创建日期:'2012-03-05T18:08:55.701Z',
本地人:
{ title: '已登录。',
user: [Circular],//现在是圆形
job_task_lists: [对象] },
title: '已登录。',
用户:[循环],
job_task_lists: [[对象], [对象], [对象], getById: [功能]],
尝试:['/home/dan/development/aqp/views/home.jade'],
范围: {},
父 View :未定义,
根:'/home/dan/development/aqp/views',
默认引擎:' Jade ',
设置:
{ 环境:'发展',
提示:真实,
意见:'/home/dan/development/aqp/views',
' View 引擎': ' Jade ' },
应用程序:
{堆栈:[对象],
连接数:6,
允许半开:真,
_handle: [对象],
_events: [对象],
httpAllowHalfOpen:假,
缓存:[对象],
设置:[对象],
重定向:{},
isCallbacks: {},
_locals: [对象],
动态 View 助手:{},
错误处理程序:[],
路线: '/',
路线:[对象],
路由器:[Getter],
__usedRouter: 真 },
部分:[功能],
提示:真实,
文件名:'/home/dan/development/aqp/views/home.jade',
布局:假,
isPartial: 真 } }
node.js:201
扔e;//process.nextTick 错误,或第一个滴答时的 'error' 事件
^
类型错误:将圆形结构转换为 JSON
在 Object.stringify( native )
在 Array.0 (/home/dan/development/aqp/node_modules/express/node_modules/connect/lib/middleware/session/memory.js:77:31)
在 EventEmitter._tickCallback (node.js:192:40)
看看用户对象是如何嵌套的?
看起来 session 正在用于将对象传输到 View 。
这是我唯一的中间件(它只从 session 中读取):
函数 requiresAuthentication(req, res, next){
如果(req.session.user){
下一个();
} 别的 {
next(new Error('未经授权。请使用有效帐户登录。'))
}
}
我唯一一次修改 req.session 是在这条路线上:
app.post('/home', function (req,res,next) {
var auth = require('./lib/authentication');
auth.authenticate_user(req.body.user,函数(用户){
如果(用户){
req.session.user = 用户;
console.log('已认证');
res.redirect(req.body.redir || '/home');
//下一个();
} 别的 {
console.log('未认证');
res.render('logins/new.jade', {title: '登录失败', redir:''})
}
});
});
我的应用程序中还没有其他内容,因为它仍然很年轻。我知道我自己不会在任何地方破坏 session ;我检查了。
我做了一些更多的测试,当我尝试在页面上使用局部变量时,这似乎只是一个问题。例如,这是我的观点 home.jade
div(数据角色=“页面”)
div(数据角色=“标题”)
a(href='/logout', data-icon='delete', data-ajax="false") 注销
h1=标题
a(href='/account', data-icon='info', data-ajax="false") 账户
!= 部分('用户',用户)
job_task_lists 中的每个 jtl
div(id=jtl.name, class = 'draggable_item', style='border:2px 纯黑色;')
#{jtl.name} - #{jtl.description}
一个(数据图标='加号')
div(数据角色=“页脚”)
h3页脚
脚本(src="/javascripts/home.js")
如果我注释掉用户部分,它会呈现,否则我会得到这个
Converting circular structure to JSON
问题。更新
所以在连接 eclipse 和 v8 调试器之后,我一直在逐步完成代码,我知道 session 和用户对象的混搭发生在哪里,
在
node_modules/connect/lib/middleware/session/session.js
utils.union 最终将用户对象的成员混入 session 中,从而导致循环引用。我只是不知道为什么(无可否认可能是我的代码)
最佳答案
这是在 View 中修改 session 数据的问题。
经过大量挖掘,我发现这是 2.5.8 中处理部分的方式的一个错误。我提交了 issue ,然后是 patch . (以防将来有人需要此信息)因为 npm 仍在提供 Express 2.5.8 AFAIK。
感谢您的帮助@freakish 和@Ryan
关于node.js - ExpressJS res.render() 错误(JSON.stringify 无法处理循环引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9561408/