'/' в обновленном словаре выдает ошибку в firebase - PullRequest
0 голосов
/ 11 мая 2018

Я выполняю миграцию базы данных на firebase, используя облачную функцию, запущенную на конечной точке http. Я в основном прохожу базу данных и собираю словарь обновлений, чтобы затем вызвать ref (). Update (dict). Я делал это раньше и у меня не было с этим проблем, но из-за новой структуры БД мне нужно сделать что-то вроде

teamUpdates['/calendar/' + visibleMonths[month] + '/' + matchId] = minifiedEvent

Проблема в том, что по какой-то причине firebase не анализирует '/' как путь и, таким образом, выдает мне ошибку:

Первый аргумент содержит недопустимый ключ (/ calendar / February 2018 / -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' и напрямую вложить все под обновления ['/ crew /' + teamId].

выглядит некрасиво, но работает! Похоже, проблема в том, что firebase не анализирует '/' после первого уровня как путь, а вместо этого рассматривает их как ключи, что, очевидно, дает сбой.

Я подожду, чтобы проверить, подтвердит ли это член группы пожарных, прежде чем я отвечу на вопрос. Спасибо всем за помощь!

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Этот код является модификацией примера @ Frank, чтобы продемонстрировать стиль построения объекта обновления, который использовал @ kylar13.Это происходит с ошибкой «неверный ключ»:

  var db = admin.database();
  var ref = db.ref("50281844");
  var updates = {};
  updates['posts/newPostKey'] = "newKeyValue";
  // create a child map with '/' in key      
  var subUpdate = {};
  subUpdate['uid/newPostKey'] = "newKeyValue";
  // add it to the update map
  updates['user-posts'] = subUpdate;

  ref.update(updates)

@ kylar13: Как вы указали в обновлении вашего поста, / s в ключах объектов может быть только на корневом уровнеобъект, и не может быть в подобъектах.Возможно, Фрэнк взглянет на это и подтвердит.

0 голосов
/ 12 мая 2018

Я только что запустил этот код в среде локального узла:

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"
    }
  }
}

Кажется, что несколько косых черт в клавишах работают нормальноздесь, поэтому я точно знаю, почему они не будут работать для вас.

См. https://stackoverflow.firebaseio.com/50281844.json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...