我的应用程序中有一个用例,我需要在数据库中的两个节点上执行更新,其中执行的更新本身取决于从这两个节点读取的数据。我写的代码确实对数据库产生了预期的效果,但日志包含错误:
Error serializing return value: TypeError: Converting circular structure to JSON
以下是重现错误所需的一些最小代码。如果数据库最初在路径“b”和“c”处有数字条目,然后在“a”处写入新值,则下面的代码将更新b和c,但会在日志中报告上述错误。
exports.bork = functions.database.ref("a").onWrite(event => {
return Promise.all([
admin.database().ref("b").once("value"),
admin.database().ref("c").once("value")
]).then(snapshots => {
var left = snapshots[0].val();
var right = snapshots[1].val();
var average = (left + right) / 2;
return Promise.all([
admin.database().ref("b").transaction(
data => { return data + average; }
),
admin.database().ref("c").transaction(
data => { return data + average; }
)
]);
});
}
);
我很确定导致这种情况的原因。它似乎只是在我阅读它后在节点上进行交易时发生,但我不明白为什么这应该是一个问题。有没有办法执行此更新以避免此错误?
编辑:根据要求,我尽可能地删除了上面的例子。它仍会产生相同的错误。
exports.bork = functions.database.ref("a").onWrite(event => {
return admin.database().ref("b").once("value")
.then(snapshots => {
return admin.database().ref("b").transaction(
data => { return data; }
);
});
});
另一方面,以下代码在网页中正常工作。
Promise.all([
database.ref("b").once("value"),
database.ref("c").once("value")
]).then(snapshots => {
console.log("Acquired snapshots.");
var left = snapshots[0].val();
var right = snapshots[1].val();
var average = (left + right) / 2;
return database.ref("b").transaction(
data => { return data + average; }
);
}).then( result=>{console.log(result)}, error=>{console.log(error)} )