【问题标题】:circular structure error when returning value in NodeJS在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 用户列表,一切都可以正常工作,但是一旦我尝试返回它对我的控制器来说它失败了......我在这里没有看到什么?

【问题讨论】:

    标签: node.js rest express mongoose


    【解决方案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尚未实现的方法)
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多