在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 错误

在 for 循环中使用 str.split 时出现“ValueError 太多值无法解包”

向结构成员添加值时出现结构分段错误

在循环中检索索引时出现问题

在指针迭代中使用 for 循环时出现分段错误

“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入