Правила Firebase проверяют два значения из одних и тех же данных (уникальные) [duplicate]

В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

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

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

6
задан Stephan Muller 22 September 2014 в 12:34
поделиться

1 ответ

Так как правила безопасности не могут перебирать список записей, чтобы найти тот, который содержит определенный бит данных, трюк здесь заключается в том, чтобы хранить записи по идентификатору, который позволяет легко получить доступ. Существует большая статья о денормализации , которая предлагает некоторые хорошие сведения об этой практике.

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

/users/user_id/items/item_id/subscribers/user_id/

Фактически, как вы увидите в денормализации, вы можете даже извлечь выгоду из раскалывая вещи еще дальше, в зависимости от точного размера ваших данных и того, как вы будете читать его позже:

/ users / user_id / items / user_id / item_id / subscription / item_id / user_id

В любом из этих форматов вы можете теперь предотвращать дублирование и блокировать защиту довольно хорошо с помощью чего-то вроде этого:

{
   "users": {
      "$user_id": { ".write": "auth.id === $user_id" }
   },
   "subscribers": {
      "$subscriber_id": { ".write": "auth.id === $subscriber_id" }
   }
}
6
ответ дан Kato 25 August 2018 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: