在NodeJS中返回值时出现循环结构错误
Posted
技术标签:
【中文标题】在NodeJS中返回值时出现循环结构错误【英文标题】:circular structure error when returning value in NodeJS 【发布时间】:2014-04-05 02:22:57 【问题描述】:我需要一些帮助来设置我在 Node + Express 中的休息路线。
我的问题如下:
controller.js:
module.exports =
findAll: function(req, res)
var users = User.findAll();
res.json(users);
;
用户.js:
module.exports =
findAll: function(req, res)
userModel.user.find(function(err, user)
if (!err)
console.log(user);
else
console.log(err);
);
;
这个 console.logs 我按预期记录了用户,但是如果我将 console.log 位更改为返回:
findAll: function(req, res)
return userModel.user.find(function(err, user)
if (!err)
return user;
else
return console.log(err);
);
它给了我一个错误:
TypeError:将循环结构转换为 JSON 在 Object.stringify (本机) 在 ServerResponse.res.json...
我看不出我在哪里会有任何圆形结构.. 我正在使用 Mongoose,就像说的那样,只要我只 console.log 用户列表,一切都可以正常工作,但是一旦我尝试返回它对我的控制器来说它失败了......我在这里没有看到什么?
【问题讨论】:
【参考方案1】:你不能只在异步执行上下文中返回一个值
问题出在这一行:
var users = User.findAll();
User.findAll();
返回一个查询对象(甚至在请求发生之前)。
所以res.json(users);
尝试对具有循环结构的查询对象进行字符串化。
From the docs:
查询#find([条件], [回调])
查找文档。
参数:
[criteria]
<Object>
mongodb选择器[callback]
<Function>
返回:
<Query>
这个当没有回调传递时,查询不会被执行。
推荐解决方案
你可以使用static methods:
userSchema.statics.findAll = function (cb)
this.find(cb);
【讨论】:
好的,所以我必须将控制器更改为 findAll: function(req, res) User.findAll(req, res);在我的 user.js 中我确实 findAll: function(req, res) userModel.user.find(function(err, user) if (!err) res.send(_.clone(user)); else console.log(err); ); @QlliOlli 查看我推荐的解决方案 在使用本机 node.js 驱动程序时无法使用 mongoose。 (对于mongoose尚未实现的方法)以上是关于在NodeJS中返回值时出现循环结构错误的主要内容,如果未能解决你的问题,请参考以下文章
访问 OleDbDataReader 项目时出现 IndexOutOfRange 错误