Firebase.update失败:第一个参数在属性中包含未定义的参数
Firebase.update failed : first argument contains undefined in property
我有一个简单的Firebase函数,可以更新一些数据。然而,解释器说第一个参数在属性"users.tester1"中包含"未定义"。有人能帮我吗?
var objify = function() {
var rv = {};
for (var i = 0; i < arguments.length; ++i)
rv[arguments[i]] = rv[arguments[i+1]];
return rv;
}
addUser("tester1", []);
var addUser = function(name, edges){
if(!checkIfUsernameExists(name) && !checkIfNodeNameExists(name) && !checkIfEdgeNameExists(name)){
var time = Firebase.ServerValue.TIMESTAMP;
//HERE: I think the error is on this line
refs.users.update(objify(name, "filler"));
refs.users.child(name).set({
"id" : time,
"edges" : "filler"
});
refs.users.child(name).child("edges").update({
"to" : "filler",
"from" : "filler"
});
addNode(new Node(name, time, name));
for(var e in edges){
refs.users.child(name).child("edges/to").update(objify(edges[e].name, true));
addEdge(new Edge(edges[e].name, time, edges[e].to, edges[e].arrows));
//TODO add a "from" edge so that you know who wants to eat you
}
refs.users.child(name).child("edges/to").set({"filler" : null});
} else {
alert("user/node/edge name taken.");
}
};
当您将对象传递给Firebase时,属性的值可以是值或null(在这种情况下,属性将被删除)。它们不能是undefined
,这是您根据错误传入的内容。
简单地孤立地运行这个片段就说明了问题:
var objify = function() {
var rv = {};
for (var i = 0; i < arguments.length; ++i)
rv[arguments[i]] = rv[arguments[i+1]];
return rv;
}
objify("name", "filler")
结果:
{名称:未定义,填充:未定义}
我的最佳选择是,您希望将键/值对作为偶数/奇数参数传递到objify
中。在这种情况下,您希望将功能更改为:
var objify = function() {
var rv = {};
for (var i = 0; i < arguments.length; i+=2)
rv[arguments[i]] = arguments[i+1];
return rv;
}
objify("name", "filler")
结果:
{name:"填充物"}
要确保您的对象不包含任何未定义的道具,请使用以下简单技巧:
JSON.parse( JSON.stringify(YourJsonData ) )
有关更多信息,请查看此代码笔:http://codepen.io/ajmueller/pen/gLaBLX
当您尝试用未定义的值更新属性时,底层Firebase库会抛出错误。它将允许null(并基本上忽略它们)。
您需要您的原始转换器来确保它忽略所有原型方法和属性,并将undefined转换为null,或者完全删除具有未定义值的任何属性。
var addUser = function(name, edges){
if(!checkIfUsernameExists(name) && !checkIfNodeNameExists(name) && !checkIfEdgeNameExists(name)){
var time = Firebase.ServerValue.TIMESTAMP;
//HERE: I think the error is on this line
refs.users.update(objify(name, "filler"));
refs.users.child(name).set({
"id" : time || null,
"edges" : "filler" || null
});
refs.users.child(name).child("edges").update({
"to" : "filler" || null,
"from" : "filler" || null
});
addNode(new Node(name, time, name));
如上所述,如果您想将所有undefined
值保存为firebase中的空值,则需要它们都是null
。
我采用这种方法来更正所有嵌套的值。
//to search and replace
const replaceAll =(s="",f="",r="")=> s.replace(new RegExp(f.replace(/[-'/''^$*+?.()|[']{}]/g, '''$&'), 'g'), r)
//to save
firebase.database().ref(`path`).update(JSON.parse(replaceAll(JSON.stringify(val),"undefined","null")))
我使用了Object.keys()
方法:
var key1 = Object.keys(firstPaymentsData)[0],
key2 = Object.keys(firstPaymentsData[key1])[0],
uid = firstPaymentsData[key1][key2].uid;
相关文章:
- 传递包含'%的参数'在URL中
- 如何使用JQuery在HTML中创建包含字符串参数的引号的onclickjavascript链接
- 建议将包含不同参数的内联JS转换为外部脚本
- Javascript-将包含变量的html字符串作为参数传递
- 如何正确地包含带有参数的谷歌地图API
- 如何存储包含参数的JS函数引用
- 在动态创建的元素中包含参数的事件处理程序
- 如何根据URL参数生成包含JS内容的单个HTML文件
- 为javascript函数提供可能包含特殊字符的字符串参数
- 用于Cordova应用程序的Javascript SQLite-使用参数搜索,其中字符串包含子字符串大小写insenst
- 如何在包含事件的情况下使用其他参数
- 如何在事件处理程序中包含函数(及其参数),而不在页面加载时调用该函数
- 使用包含参数数组的数组调用函数,而不是仅列出数组
- 如何将数组作为参数从 Ipython 笔记本传递到 html 文件,其中包含一些 javascript 函数
- 当参数包含 html 标记时,Ajax 调用失败
- 如果在调用函数时提供的参数包含空格,则不调用函数
- 参数包含函数中的表达式
- JS:如何将函数参数包含到一大块字符串中
- iOS: evaluateJavaScript将不会调用参数包含换行符的函数
- 当参数包含括号时,为什么javascript会因为语法错误而失败