node.js - ExpressJS res.render() 错误(JSON.stringify 无法处理循环引用)

标签 node.js express

这里有什么问题?
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/

    相关文章:

    node.js - Express/Node 应用程序的经过身份验证的登录架构

    javascript - 如何向 Node 添加错误处理/表达MySQL函数

    node.js - 终止大量 SSL 连接具有成本效益

    javascript - node.js 字体无法正常工作并且没有显示错误

    javascript - 使用 Node.js 从 POST 请求中唯一标识用户

    javascript - Express的req.params格式是什么?

    javascript - 如何在 Angular Controller 中使用 Browserified npm 包?

    javascript - 如何让 moment.js 将日期 '1234 56 78' 视为无效日期?

    javascript - 使用 Javascript node.js 如何并行处理 For 循环?

    javascript - 解决快速获取请求中的 UnhandledPromiseRejectionWarning