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
});
});
// });
问题描述
在使用 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
数据传递给视图进行渲染。
通过这种方式,可以避免在序列化过程中遇到的循环引用问题,从而解决错误。