JS SDK 无法向 AV.Object 的数组属性添加 AV.File

环境:

  • LeanEngine Node.js
  • leanengine@0.1.4
  • 在本地使用 avoscloud 命令运行

代码:

fs.readFileAsync(file.path)
.then(function (buffer) {
  app.add('screenshots', new AV.File(file.name, buffer))
  return app.save()
})

报错(保密原因我已将我自己的路径隐藏):

<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:5132
        var json = JSON.stringify(value);
                        ^
TypeError: Converting circular structure to JSON
    at Object.stringify (native)
    at _.extend._resetCacheForKey (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:5132:25)
    at <my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:4885:20
    at <my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:1909:9
    at Array.forEach (native)
    at Function._.each._.forEach (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:83:11)
    at Object.AV._objectEach.AV._each (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:1908:9)
    at _.extend._refreshCache (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:4881:10)
    at _.extend.save (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:5555:13)
    at <my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:5566:24
    at wrappedResolvedCallback (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:3872:40)
    at <my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:3795:26
    at Array.forEach (native)
    at Object._.each._.forEach [as _arrayEach] (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:83:11)
    at _.extend.resolve (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:3794:10)
    at wrappedResolvedCallback (<my project>/node_modules/leanengine/node_modules/avoscloud-sdk/dist/av.js:3882:27)

请先保存 new AV.File(file.name, buffer) ,然后再去关联。

那应该不是 AV.File 的问题,从错误来看是对象循环应用了,比如 app 的属性里还引用了 app 本身这样的场景,导致 json 序列化失败。

@dennis 没有,我把 app.add('screenshot' ... ) 这一个调用去掉就没事了。app 对象是已有的。

确认是 js sdk 的bug,你可以暂时通过这个办法规避:

file.save().then(function(){
app.add("screenshot", AV._encode(file));
return app.save();
});

我们将下个 js 版本里修复这个问题。

好,辛苦了。

请问这个问题修复了吗?关联文件如果想要保存的话,还是需要先手动保存文件,然后再回过来保存父对象吗?

已经修复了,如果有问题请到 Bug 汇报版块提问,附上详细的代码和重现流程。