Node.js '/';更新中的字典在firebase中引发错误

Node.js '/';更新中的字典在firebase中引发错误,node.js,firebase,firebase-realtime-database,google-cloud-functions,Node.js,Firebase,Firebase Realtime Database,Google Cloud Functions,我正在firebase上使用http端点上触发的云函数进行数据库迁移。 我基本上要遍历数据库并组装一个更新字典,然后调用ref().update(dict)。我以前做过,没有任何问题,但是由于新的db结构,我需要做如下的事情 teamUpdates['/calendar/' + visibleMonths[month] + '/' + matchId] = minifiedEvent 问题在于,出于某种原因,firebase没有将“/”解析为路径,因此给了我一个错误: 第一个参数包含无效密钥(

我正在firebase上使用http端点上触发的云函数进行数据库迁移。 我基本上要遍历数据库并组装一个更新字典,然后调用ref().update(dict)。我以前做过,没有任何问题,但是由于新的db结构,我需要做如下的事情

teamUpdates['/calendar/' + visibleMonths[month] + '/' + matchId] = minifiedEvent
问题在于,出于某种原因,firebase没有将“/”解析为路径,因此给了我一个错误:

第一个参数包含无效密钥(/calendar/2018年2月/-L5n0GL4OjV3fnRg2wYV)。 键必须是非空字符串,并且不能包含“.”、“$”、“/”、“[”或“]”

在文档中,它使用“/”字符来定义路径,我以前也成功地使用过它,所以我不知道问题出在哪里。有什么想法吗

这就是他们在文档中所做的:

var updates = {};
updates['/posts/' + newPostKey] = postData;
updates['/user-posts/' + uid + '/' + newPostKey] = postData;
我认为正在发生的是,我有一个函数,它返回一个包含一些更新的对象,然后将其添加到第二个更新对象中(为了让我的函数更干净,我在另一个函数中构建该对象并返回它)。大概是这样的:

// This function returns the 'teamUpdates' object
const team = teamMigration(data[teamId])
// This is the dictionary that database.ref().update() gets called with
updates['/teams/' + teamId] = team
更新1:我重构了代码,废弃了整个“teamUpdates”字典,直接将所有内容嵌套在更新['/teams/'+teamId]下

看起来很难看,但很管用!问题似乎是firebase没有将第一级之后的“/”解析为路径,而是将它们视为键,这显然是失败的


在我回答问题之前,我会等着看firebase团队成员是否证实了这一点。谢谢大家的帮助

我刚刚在本地节点环境中运行了以下代码:

var admin = require('firebase-admin');
var serviceAccount = require("./stackoverflow-3d9889aaeddb.json");
admin.initializeApp({ credential: admin.credential.cert(serviceAccount),databaseURL: "https://stackoverflow.firebaseio.com"});

var db = admin.database();
var ref = db.ref("50281844");
var updates = {};
updates['posts/newPostKey'] = "newKeyValue"
updates['user-posts/uid/newPostKey'] = "newKeyValue"
ref.update(updates)
然后它把这个写进了数据库:

{
  "posts" : {
    "newPostKey" : "newKeyValue"
  },
  "user-posts" : {
    "uid" : {
      "newPostKey" : "newKeyValue"
    }
  }
}
键中的多个斜杠在这里似乎可以正常工作,所以我可以确定它们为什么不适合您


请参见

我刚刚在本地节点环境中运行了此代码:

var admin = require('firebase-admin');
var serviceAccount = require("./stackoverflow-3d9889aaeddb.json");
admin.initializeApp({ credential: admin.credential.cert(serviceAccount),databaseURL: "https://stackoverflow.firebaseio.com"});

var db = admin.database();
var ref = db.ref("50281844");
var updates = {};
updates['posts/newPostKey'] = "newKeyValue"
updates['user-posts/uid/newPostKey'] = "newKeyValue"
ref.update(updates)
然后它把这个写进了数据库:

{
  "posts" : {
    "newPostKey" : "newKeyValue"
  },
  "user-posts" : {
    "uid" : {
      "newPostKey" : "newKeyValue"
    }
  }
}
键中的多个斜杠在这里似乎可以正常工作,所以我可以确定它们为什么不适合您


请参见

此代码是对@Frank示例的修改,以演示@kylar13使用的更新对象构造样式。此操作失败,出现“无效密钥”错误:


@kylar13:正如您在文章的更新中所指出的,对象键中的
/
s似乎只能在根级对象中,而不能在子对象中。也许Frank会看看并确认。

此代码是对@Frank示例的修改,以演示@kylar13使用的更新对象构造样式。此操作失败,出现“无效密钥”错误:


@kylar13:正如您在文章的更新中所指出的,对象键中的
/
s似乎只能在根级对象中,而不能在子对象中。也许Frank会看看这一点并确认。

没有领先的
/
。例如:
updates['posts/'+newPostKey]=postData。你试过了吗?是的,我一开始也没有,在我看到后加上。我认为这没什么区别。虽然没有列为无效字符之一,但我想知道2018年2月
中的空格是否是问题所在?把它扔出去,使用
database.ref('/').update()
显式从根开始怎么样?我们在一些键中已经有空格,这不会引起问题,所以我对此表示怀疑。没有一个前导的
/
。例如:
updates['posts/'+newPostKey]=postData。你试过了吗?是的,我一开始也没有,在我看到后加上。我认为这没什么区别。虽然没有列为无效字符之一,但我想知道2018年2月
中的空格是否是问题所在?把它扔出去,使用
database.ref('/').update()
显式从根开始怎么样?我们在一些键中已经有空格,这不会引起问题,所以我对此表示怀疑。我在回答中提供了示例代码,希望能澄清失败案例。请看一看。我在回答中提供了示例代码,希望能澄清失败案例。请看一看。这的确是正确的Bob:数据库解析JSON,将(顶级)键转换为路径,并为每个路径调用
set()
。这个过程没有递归。这正是发生在我身上的事情!似乎只有顶层“/”被解析为路径。谢谢大家的帮助@kylar13请接受一个答案,以便其他用户可以看到这个问题包含一个解决方案。这确实是正确的Bob:数据库解析JSON,将(顶级)键转换为路径,并本质上为每个路径调用
set()
。这个过程没有递归。这正是发生在我身上的事情!似乎只有顶层“/”被解析为路径。谢谢大家的帮助@kylar13请接受答案,以便其他用户可以看到此问题包含解决方案。