在NodeJS中返回值时出现循环结构错误

时间:2014-03-03 20:37:51

标签: node.js rest express mongoose

我需要一些关于在Node + Express中设置其余路由的帮助。

我的问题如下:

controller.js:

module.exports = {
  findAll: function(req, res) {
    var users = User.findAll();
    res.json(users);
  }

};

user.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       at Object.stringify(native)       在ServerResponse.res.json ...

我没有看到我会在哪里有任何圆形结构..我正在使用Mongoose,就像说的,只要我只用console.log用户列表,一切正常,但是一旦我尝试返回它我的控制器失败了...我在这里看不到什么?

1 个答案:

答案 0 :(得分:3)

您不能只在异步执行上下文中返回值

问题在于这一行:

var users = User.findAll();

User.findAll();返回一个查询对象(在请求发生之前)。

所以res.json(users);尝试对具有循环结构的查询对象进行字符串化。

From the docs

  

查询#ref([criteria],[callback])

     

查找文档。

     

<强>参数:

     

[criteria] <Object> mongodb选择器
  [callback] <Function>

     

<强>返回:

     

<Query>这个

     

如果没有传递回调,则不执行查询。

     

推荐的解决方案

您可以使用static methods

userSchema.statics.findAll = function (cb) {
  this.find(cb);
}