【问题标题】:Sails.js res.json not returning deep properties when using nested-popSails.js res.json 使用嵌套弹出时不返回深层属性
【发布时间】:2017-10-14 21:18:10
【问题描述】:

我有这段代码可以使用nested-pop 获取一些具有深层嵌套关联的股票数据:

Stock.find({limit:100, sort:'name ASC'})
  .populate('scans', {limit:1,sort:'createdAt DESC'})
  .then((stocks) => {
    return nestedPop(stocks, {
      scans: ['values']
    })
  }).then(stocks => {
    console.log(stocks[0].scans[0]);
    res.json(stocks);
  })

在服务器控制台中记录扫描并打印 values 数组。但是 res.json 会返回所有扫描都缺少 values 数组的股票。

预期输出:

[{
  id: 1,
  scans: [
    {
      id: 1,
      values: [
        {
          id: 1,
          value: 0.5,
          type: 1
        },
        ...
      ]
    }
  ]
}, ...]

返回的输出:

[{
  id: 1,
  scans: [
    {
      id: 1,
    }
  ]
}, ...]

该错误似乎与对象的深度无关,因为我用一些更深的测试对象对其进行了测试,并且所有内容都返回了。我只是不明白如果 它在那里,res.json 怎么不返回它。

更新:

我现在进行了其他测试,发现.toObject.toJSON 在单个股票上调用都会导致值在服务器端消失。而且因为res.json 在传递的对象上调用.toJSON,所以它也不会出现在浏览器中。

【问题讨论】:

  • 您是否覆盖了任何模型的.toJSON 方法?我认为这些是由res.json 自动调用的。
  • 不,我没有覆盖 .toJSON。
  • 你不需要覆盖,尝试在对象上调用.toObject(),然后再将其发送回用户

标签: javascript json sails.js


【解决方案1】:

nestedPop 返回的值不能被.toJSON 正确解析,因为它们已经被转换了。 我通过在将所有股票传递到nestedPop之前转换所有股票解决了这个问题,所以工作代码是:

Stock.find({limit:100, sort:'name ASC'})
  .populate('scans', {limit:1,sort:'createdAt DESC'})
  .then((stocks) => {
    stocks = stocks.map((s) => s.toJSON());
    return nestedPop(stocks, {
      scans: ['values']
    })
  }).then(stocks => {
    console.log(stocks[0].scans[0]);
    res.json(stocks);
  })

现在所有内容都记录在服务器端并传递给浏览器。

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2016-10-16
    • 2023-03-23
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多