Nodejs 求帮助啊 使用connect-mongo的问题:Converting circular structure to JSON

Nodejs 求帮助啊 使用connect-mongo的问题:Converting circular structure to JSON

代码如下:
var currentUser = req.session.user;
User.getAllAttentionUsers(currentUser.name,function(err,docs){
if(err){
req.flash(‘error’, err);
}
Post.pagePost(null,PAGE_SIZE_DEFAULT,page,function (err, posts) {
if (err) {
posts = [];
}
res.render(‘post’, {
title: ‘首页’,
typeName: ‘首页’,
user: currentUser,
posts: posts
});
});
});

错误如下:
TypeError: Converting circular structure to JSON
at MongoStore.stringify [as _serialize_session] (native)
at MongoStore.module.exports.MongoStore.set (D:\软件\lizi\birdFly\node_modules\connect-mongo\lib\connect-mongo.js:220:40)
at Session.save (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session\session.js:63:25)
at ServerResponse.res.end (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session.js:282:19)
at ServerResponse.res.send (D:\软件\lizi\birdFly\node_modules\express\lib\response.js:152:8)
at res.render.fn (D:\软件\lizi\birdFly\node_modules\express\lib\response.js:756:10)
at View.exports.renderFile [as engine] (D:\软件\lizi\birdFly\node_modules\ejs\lib\ejs.js:317:3)
at View.render (D:\软件\lizi\birdFly\node_modules\express\lib\view.js:76:8)
at Function.app.render (D:\软件\lizi\birdFly\node_modules\express\lib\application.js:506:10) at ServerResponse.res.render (D:\软件\lizi\birdFly\node_modules\express\lib\response.js:760:7) TypeError: Converting circular structure to JSON at Object.stringify (native) at hash (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session.js:352:28) at ServerResponse.end (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session.js:265:34) at ServerResponse.EventEmitter.emit (events.js:92:17) at ServerResponse.res.writeHead (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\patch.js:73:36) at ServerResponse._implicitHeader (http.js:1132:8) at ServerResponse.OutgoingMessage.end (http.js:921:10) at ServerResponse.module.exports.res.end (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\logger.js:148:13) at res.end (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session.js:285:13) at MongoStore.module.exports.MongoStore.set (D:\软件\lizi\birdFly\node_modules\connect-mongo\lib\connect-mongo.js:250:19)

D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session.js:352 return crc32.signed(JSON.stringify(sess, function(key, val){ ^ TypeError: Converting circular structure to JSON at Object.stringify (native) at hash (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session.js:352:28) at ServerResponse.end (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\session.js:265:34) at ServerResponse.EventEmitter.emit (events.js:92:17) at ServerResponse.res.writeHead (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\patch.js:73:36) at ServerResponse._implicitHeader (http.js:1132:8) at ServerResponse.OutgoingMessage.end (http.js:921:10) at module.exports.error.message (D:\软件\lizi\birdFly\node_modules\express\node_modules\connect\lib\middleware\errorHandler.js:64:17) at fs.js:266:14 at Object.oncomplete (fs.js:107:15)

代码修改为以下 则正常:
var currentUser = req.session.user;
// User.getAllAttentionUsers(currentUser.name,function(err,docs){
// if(err){
// req.flash(‘error’, err);
// }
Post.pagePost(null,PAGE_SIZE_DEFAULT,page,function (err, posts) {
if (err) {
posts = [];
}
res.render(‘post’, {
title: ‘首页’,
typeName: ‘首页’,
user: currentUser,
posts: posts
});
});
// });


4 回复

问题描述

在使用 connect-mongo 进行会话存储时,遇到 TypeError: Converting circular structure to JSON 错误。这个错误通常发生在尝试将一个循环引用的对象序列化为 JSON 时。

示例代码

var express = require('express');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);

var app = express();

app.use(session({
    secret: 'your-secret-key',
    store: new MongoStore({
        url: 'mongodb://localhost:27017/session-db'
    }),
    resave: false,
    saveUninitialized: false
}));

app.get('/', function(req, res) {
    var currentUser = req.session.user;

    // 假设 User.getAllAttentionUsers 是一个异步函数
    User.getAllAttentionUsers(currentUser.name, function(err, docs) {
        if (err) {
            req.flash('error', err);
        }

        Post.pagePost(null, PAGE_SIZE_DEFAULT, page, function(err, posts) {
            if (err) {
                posts = [];
            }

            res.render('post', {
                title: '首页',
                typeName: '首页',
                user: currentUser,
                posts: posts
            });
        });
    });
});

app.listen(3000, function() {
    console.log('App is running on port 3000');
});

解决方案

在上述代码中,currentUser 对象可能包含循环引用。可以通过移除不必要的循环引用来解决这个问题。例如,如果 User.getAllAttentionUsers 函数不需要返回的数据,可以将其注释掉。

修改后的代码

var express = require('express');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);

var app = express();

app.use(session({
    secret: 'your-secret-key',
    store: new MongoStore({
        url: 'mongodb://localhost:27017/session-db'
    }),
    resave: false,
    saveUninitialized: false
}));

app.get('/', function(req, res) {
    var currentUser = req.session.user;

    // 如果不需要调用 User.getAllAttentionUsers,可以注释掉这部分代码
    // User.getAllAttentionUsers(currentUser.name, function(err, docs) {
    //     if (err) {
    //         req.flash('error', err);
    //     }
    // });

    Post.pagePost(null, PAGE_SIZE_DEFAULT, page, function(err, posts) {
        if (err) {
            posts = [];
        }

        res.render('post', {
            title: '首页',
            typeName: '首页',
            user: currentUser,
            posts: posts
        });
    });
});

app.listen(3000, function() {
    console.log('App is running on port 3000');
});

解释

  • 循环引用:在 JavaScript 中,对象可以相互引用,形成循环引用。当尝试将这些对象序列化为 JSON 时,会导致错误。
  • 解决方案:通过移除不必要的循环引用或简化对象结构,可以避免此错误。
  • 示例:在上述代码中,如果 User.getAllAttentionUsers 函数不需要返回的数据,可以将其注释掉,从而避免潜在的循环引用问题。

通过这种方式,可以有效地解决 Converting circular structure to JSON 错误,并确保应用能够正常运行。


为什么没人啊?难道大家都没出现过这个问题,还是什么原因?求大神帮助啊

问题解决了,感谢大家的“帮助”哈

这个问题通常是由于 req.session.user 中包含了循环引用的对象导致的。当 Node.js 尝试将 user 对象序列化为 JSON 时,会因为循环引用而抛出错误。

示例代码修改

为了修复这个问题,可以考虑将 user 对象中的循环引用部分移除或使用其他方法来避免序列化问题。一种常见的做法是只保留需要渲染模板的数据。

var currentUser = req.session.user;

// 只保留需要的数据
var userDataForRender = {
    id: currentUser.id,
    name: currentUser.name,
    // 其他需要的数据字段
};

User.getAllAttentionUsers(currentUser.name, function(err, docs) {
    if (err) {
        req.flash('error', err);
    }

    Post.pagePost(null, PAGE_SIZE_DEFAULT, page, function(err, posts) {
        if (err) {
            posts = [];
        }

        res.render('post', {
            title: '首页',
            typeName: '首页',
            user: userDataForRender,
            posts: posts
        });
    });
});

解释

  • userDataForRender:只包含需要传递给视图的数据字段,不包括可能导致循环引用的部分。
  • User.getAllAttentionUsers:继续执行查询操作,并根据需要处理错误。
  • Post.pagePost:查询文章数据,并在错误发生时设置默认为空数组。
  • res.render:将简化后的 user 数据和 posts 数据传递给视图进行渲染。

通过这种方式,可以避免在序列化过程中遇到的循环引用问题,从而解决错误。

回到顶部