我正在编写一个应用程序,允许用户提交在向其他用户显示之前进行审核的提名.这需要一些限制,到目前为止我没有成功实施安全规则:
我目前的规则如下:
{
"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) 我的许多Backbone模型经常处理嵌套模型和集合,到目前为止我正在使用组合defaults,parse并toJSON手动实现嵌套:
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) 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 …
在Dan Schafer 在React Europe的优秀"GraphQL at Facebook"演讲中,他讨论了如何在业务层模型中集中授权,避免了必须为通向授权节点的每个边缘复制授权逻辑的问题.
这适用Todo.getById(1)于在我的情况下最终最终查询数据库SELECT * from todos WHERE id=1然后验证授权的事情checkCanSee(resultFromDatabase).
但是,假设我的todos表现在包含来自多个用户的100,000个待办事项,纯粹在业务层中执行授权变得不切实际,因为我需要获取每个待办事项,使用共享授权逻辑过滤结果然后切片以执行分页.
我错误地认为解决这个问题的唯一方法是让授权逻辑驻留在持久层本身吗?
tl; dr在Firebase中执行基本分页startAt,endAt并且limit非常复杂,必须有一个更简单的方法.
我正在为大量用户提交构建一个管理界面.我的初始(和当前)想法是简单地获取所有内容并在客户端上执行分页.然而,当获取2000个以上的记录(每个包含5-6个小数字/字符串字段)时,存在明显的延迟,我将其归因于超过1.5mb的数据有效载荷.
目前所有的条目都是通过push但是我对于如何通过巨大的列表进行分页而丢失了.
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.
有没有更简单的方法来做到这一点,还是我应该回去取一切?
我正在使用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耗尽其内存缓存中的所有可用内存?