小编Sim*_*ken的帖子

使用安全规则限制子/域访问

我正在编写一个应用程序,允许用户提交在向其他用户显示之前进行审核的提名.这需要一些限制,到目前为止我没有成功实施安全规则:

  1. 隐藏尚未批准的任何提名
  2. 隐藏提交中的私人字段(电话,审批状态,创建日期等)

我目前的规则如下:

{
    "rules": {
        "nominations": {
            ".read": true,

            "$nominationId": {
                ".read": "data.child('state').val() == 'approved' || auth != null", // Only read approved nominations if not authenticated
                ".write": "!data.exists()", // Only allow new nominations to be created

                "phone": {
                    ".read": "auth != null" // Only allow authenticated users to read phone number
                },

                "state": {
                    ".read": "auth != null", // Only allow authenticated users to read approval state
                    ".write": "auth != null" // Only allow authenticated users to …
Run Code Online (Sandbox Code Playgroud)

firebase firebase-realtime-database

49
推荐指数
2
解决办法
2万
查看次数

嵌套Backbone.js集合的更好解决方案

我的许多Backbone模型经常处理嵌套模型和集合,到目前为止我正在使用组合defaults,parsetoJSON手动实现嵌套:

ACME.Supplier = Backbone.Model.extend({
    defaults: function() {
        return {
            contacts: new ACME.Contacts(),
            tags: new ACME.Tags(),
            attachments: new ACME.Attachments()
        };
    },

    parse: function(res) {
        if (res.contacts) res.contacts = new ACME.Contacts(res.contacts);
        if (res.tags) res.tags = new ACME.Tags(res.tags);
        if (res.attachments) res.attachments = new ACME.Attachments(res.attachments);

        return res;
    }
});

ACME.Tag = Backbone.Model.extend({
    toJSON: function() {
        return _.pick(this.attributes, 'id', 'name', 'type');
    }
});
Run Code Online (Sandbox Code Playgroud)

我看了几个插件,基本上和上面一样,但是控制和更多的样板很少,所以我想知道是否有人对这个常见的Backbone.js问题有更优雅的解决方案.


编辑:我最终采用以下方法:

ACME.Supplier = Backbone.Model.extend({
    initialize: function(options) {
        this.tags = new ACME.Tags(options.tags);
    },

    parse: function(res) …
Run Code Online (Sandbox Code Playgroud)

nested-attributes backbone.js

17
推荐指数
1
解决办法
8144
查看次数

避免具有异步数据依赖性的事件链

Facebook Flux调度员明确禁止ActionCreators派遣其他ActionCreator.这种限制可能是一个好主意,因为它会阻止您的应用程序创建事件链.

但是,只要存储包含异步ActionCreator中彼此依赖的数据的存储,就会出现问题.如果不CategoryProductsStore依赖于CategoryStore似乎没有办法避免事件链,而不诉诸推迟后续行动.

场景1: 包含类别中的产品列表的商店需要知道应该从哪个类别ID获取产品.

var CategoryProductActions = {
  get: function(categoryId) {
    Dispatcher.handleViewAction({
      type: ActionTypes.LOAD_CATEGORY_PRODUCTS,
      categoryId: categoryId
    })

    ProductAPIUtils
      .getByCategoryId(categoryId)
      .then(CategoryProductActions.getComplete)
  },

  getComplete: function(products) {
    Dispatcher.handleServerAction({
      type: ActionTypes.LOAD_CATEGORY_PRODUCTS_COMPLETE,
      products: products
    })
  }
}

CategoryStore.dispatchToken = Dispatcher.register(function(payload) {
  var action = payload.action

  switch (action.type) {
    case ActionTypes.LOAD_CATEGORIES_COMPLETE:
      var category = action.categories[0]

      // Attempt to asynchronously fetch products in the given category, this causes an invariant to be thrown.
      CategoryProductActions.get(category.id)

      ...
Run Code Online (Sandbox Code Playgroud)

场景2: 另一种情况是,当存储更改及其componentWillMount/ componentWillReceiveProps …

reactjs reactjs-flux

13
推荐指数
1
解决办法
1853
查看次数

GraphQL业务层中的列表和分页授权

在Dan Schafer 在React Europe的优秀"GraphQL at Facebook"演讲中,讨论了如何在业务层模型中集中授权,避免了必须为通向授权节点的每个边缘复制授权逻辑的问题.

三层

这适用Todo.getById(1)于在我的情况下最终最终查询数据库SELECT * from todos WHERE id=1然后验证授权的事情checkCanSee(resultFromDatabase).

但是,假设我的todos表现在包含来自多个用户的100,000个待办事项,纯粹在业务层中执行授权变得不切实际,因为我需要获取每个待办事项,使用共享授权逻辑过滤结果然后切片以执行分页.

我错误地认为解决这个问题的唯一方法是让授权逻辑驻留在持久层本身吗?

pagination authorization graphql

6
推荐指数
1
解决办法
296
查看次数

Paginating按时间顺序排列Firebase儿童优先顺序

tl; dr在Firebase中执行基本分页startAt,endAt并且limit非常复杂,必须有一个更简单的方法.

我正在为大量用户提交构建一个管理界面.我的初始(和当前)想法是简单地获取所有内容并在客户端上执行分页.然而,当获取2000个以上的记录(每个包含5-6个小数字/字符串字段)时,存在明显的延迟,我将其归因于超过1.5mb的数据有效载荷.

目前所有的条目都是通过push但是我对于如何通过巨大的列表进行分页而丢失了.

要取我使用的数据的第一页endAt有一个limit5:

ref.endAt().limit(10).on('child_added', function(snapshot) {
    console.log(snapshot.name(), snapshot.val().name)
})
Run Code Online (Sandbox Code Playgroud)

这导致以下结果:

-IlNo79stfiYZ61fFkx3 #46 John
-IlNo7AmMk0iXp98oKh5 #47 Robert
-IlNo7BeDXbEe7rB6IQ3 #48 Andrew
-IlNo7CX-WzM0caCS0Xp #49 Frank
-IlNo7DNA0SzEe8Sua16 #50 Jimmmy
Run Code Online (Sandbox Code Playgroud)

首先要弄清楚有多少页面我保留了一个单独的计数器,只要有人添加或删除记录就会更新.

其次,因为我正在使用push我无法导航到特定页面,因为我不知道特定页面的最后一条记录的名称,这意味着目前这样的界面是不可能的:

标准分页控件

为了简单起见,我决定简单地使用下一个/上一个按钮,这也会带来一个新问题; 如果我使用上一个结果集中第一个记录的名称,我可以使用以下内容分页到下一页:

ref.endAt(null, '-IlNo79stfiYZ61fFkx3').limit(5).on('child_added', function(snapshot) {
    console.log(snapshot.name(), snapshot.val().name)
})
Run Code Online (Sandbox Code Playgroud)

此操作的结果如下:

-IlNo76KDsN53rB1xb-K #42 William
-IlNo77CtgQvjuonF2nH #43 Christian
-IlNo7857XWfMipCa8bv #44 Jim
-IlNo78z11Bkj-XJjbg_ #45 Richard
-IlNo79stfiYZ61fFkx3 #46 John
Run Code Online (Sandbox Code Playgroud)

现在我有下一页,除了它移动了一个位置意味着我必须调整我的限制并忽略最后一个记录.

要向后移动一页,我必须在客户端保留一份单独的列表,列出我目前收到的每条记录,并找出要传递给的名称startAt.

有没有更简单的方法来做到这一点,还是我应该回去取一切?

firebase

5
推荐指数
1
解决办法
1769
查看次数

限制Firebase内存缓存

我正在使用node.js在EC2 Micro实例上将大量数据聚合到Firebase中.该应用程序扫描了许多照片来源,并维护Firebase的每张照片的元数据,如网址,大小,来源,"喜欢"等.

我还保留了一些更新的聚合索引(按日期,喜欢等).实际代码非常简单:

var db = new Firebase('https://my.firebaseio.com')

// Whenever the aggregator updates a photo, update the popularity inedx
db.child('photos').on('child_changed', function(snapshot) {
    var instagram = snapshot.child('likes/instagram').val() || 0,
        facebook = snapshot.child('likes/facebook').val() || 0,
        likes = instagram + facebook

    // Update popularity index
    db.child('index/popularity').child(snapshot.name()).setWithPriority(true, likes)
})
Run Code Online (Sandbox Code Playgroud)

由于我的实例(t1.micro)只有615mb的RAM可用,因为Firebase photos在更新时缓存了集合中的所有子节点,因此RAM耗尽.

有没有办法阻止Firebase耗尽其内存缓存中的所有可用内存?

node.js firebase

0
推荐指数
1
解决办法
991
查看次数