我正在使用Firebase Hosting来托管网络应用.我还在网站上主持一些小型截屏视频,但每次我想对应用进行更改并进行部署时,我都要等待视频被推送.
有没有办法有选择地将更改推送到Firebase?另外,为什么Firebase不会简单地推送新的/更改/触摸的文件?我假设因为它没有对托管应用程序进行任何修订控制,因此没有跟踪这些事情,但这只会使选择性推送更加需要.
有几个问题与Twitter Bootstrap的按钮收音机/复选框组相关,但似乎都没有新的Bootstrap约定(我正在使用v3.3.4)或我的问题.
旧的约定是声明一个<div class="btn-group">
包围了许多<button>
的,并且周围的div也有一个data-toggle
属性buttons-checkbox
或buttons-radio
看起来像这样:
<div class="btn-group" data-toggle="buttons-checkbox">
<button type="button" class="btn btn-primary">Btn 1</button>
<button type="button" class="btn btn-primary">Btn 2</button>
<button type="button" class="btn btn-primary">Btn 3</button>
</div>
Run Code Online (Sandbox Code Playgroud)
但是,创建这些类的组的约定已经改变,可以在按钮的Bootstrap Javascript页面上看到(http://getbootstrap.com/javascript/#buttons-checkbox-radio):
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="checkbox" autocomplete="off" checked> Checkbox 1 (pre-checked)
</label>
<label class="btn btn-primary">
<input type="checkbox" autocomplete="off"> Checkbox 2
</label>
<label class="btn btn-primary">
<input type="checkbox" autocomplete="off"> Checkbox 3
</label>
</div>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,按钮现在实际上是具有类型的子输入字段的标签,checkbox
或者radio
被设计为看起来像按钮的标签.
我想设置一个.on('click')
事件来捕获刚刚被点击的按钮的状态,但是后面的逻辑是奇怪的倒退(并且Javascript的实现似乎是不完整的,至少在我看来 - …
说我有以下内容:
var firebaseARef = new Firebase("http://this.is.my/firebase/url/A/reference")
var firebaseBRef = new Firebase("http://this.is.my/firebase/url/B/reference")
Run Code Online (Sandbox Code Playgroud)
当我定义我的.on()
函数时,我想指定一个处理程序,然后在我的代码中的一个地方执行所有处理,而不是必须定义与.on()
定义内联的函数.为了显示:
var handleAllFirebaseStuff = function(dataSnapshot){
var name = dataSnapshot.name(); //PROBLEM HERE: returns "reference", no way to distinguish!
switch(name){
case "http://this.is.my/firebase/url/A/reference": //How do I get this full reference from dataSnapshot?
/* do stuff for A reference */
case "http://this.is.my/firebase/url/B/reference": //How do I get this full reference from dataSnapshot?
/* do stuff for B reference */
default:
break;
}
}
firebaseARef.on('value', handleAllFirebaseStuff);
firebaseBRef.on('value', handleAllFirebaseStuff);
Run Code Online (Sandbox Code Playgroud)
问题dataSnapshot.name()
只会 …
它看起来像Firebase,当他们从v2移动到v3.x SDK(现在进入v4)时,决定删除自动会话到期的选项,转而使用经过身份验证的模型.
这是一个很好的功能,但从网络安全的角度来看,我发现了一些问题,因为这是使用Firebase生成的令牌(例如电子邮件和密码身份验证)的Firebase SDK 的唯一选项(其中一些在链接的Google中得到了很好的解释)小组讨论).
user.signOut()
在页面退出时调用的常见建议有一些漏洞.也就是说,如果客户端崩溃,那么这个代码永远不会被执行,因此策略就会崩溃."登出页面加载"建议也有漏洞:
user.signOut()
我正在寻找一种更好的工作策略,从网络安全的角度来看,允许用户选择"经常认证"的策略,如果他/她选择的话,而不是默认的(即使用"记住我"按钮).
我想出的一个策略如下:
这感觉更安全,因为onDisconnect
即使浏览器崩溃,该方法仍将执行.但是,JWT不能用作Firebase规则变量(只有令牌的内容)!
鉴于这些问题/有缺陷的方法,如何在浏览器使用Firebase生成的令牌关闭/崩溃(甚至在预定的一段时间后)后使会话无效?
我正在尝试创建一个简单的SOAP消息从客户端发送,但我(貌似)无法更改信封中"soap"命名空间的URI.
这就是soap标题应该是这样的:
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> ... </soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
所以我有以下代码:
final SOAPMessage sm = MessageFactory.newInstance().createMessage();
final SOAPPart sp = sm.getSOAPPart();
final SOAPEnvelope se = sp.getEnvelope();
final SOAPHeader sh = se.getHeader();
final SOAPBody sb = se.getBody();
se.removeNamespaceDeclaration(se.getPrefix());
se.addNamespaceDeclaration("soap", "http://www.w3.org/2001/12/soap-envelope");
se.setPrefix("soap");
sb.setPrefix("soap");
sh.setPrefix("soap");
se.setEncodingStyle("http://www.w3.org/2001/12/soap-encoding/");
Run Code Online (Sandbox Code Playgroud)
但是,当我在发送之前打印邮件时,以下是我的信封:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/">
Run Code Online (Sandbox Code Playgroud)
请注意"应该是"部分中的xmlns:soap的URI与实际的差异.
如果我将addNamespaceDeclaration
调用的第一个参数更改为"soapy"而不是"soap",这是我得到的以下信封:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapy="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/">
Run Code Online (Sandbox Code Playgroud)
我猜它可能与调用的事实有关,addNamespaceDeclaration
而不是类似的事情changeNamespaceDeclaration
,并且考虑到命名空间已经存在而被忽略,但我找不到有用的东西(我已经尝试过了setAttributeNS
).
编辑:我刚才意识到这setAttributeNS
很愚蠢,因为它改变了命名空间,而不是URI.编辑再次:我有点困惑,因为我继续搜索,我有时会看到命名soap:"Namespace"
,所以从这个意义上说我确实想要更改命名空间......但我认为命名空间是"肥皂"的一部分.有任何澄清吗?
这是我的第一篇文章,所以我道歉,如果我问的是已经解决的问题,但我已经四处搜索,我发现的大部分内容与更改命名空间有关(比如SOAP-ENV,这是默认命名空间,而不是URI本身.提前致谢.
-M
我有一个应用程序,我想在其中加载一些初始数据(完成Firebase.once('value')
),然后在某个时候我想要接收已添加到该Firebase引用的子节点的事件.
为此,我想使用Firebase.on('child_added')
,但根据定义(并在实践中看到),它首先加载Firebase引用的所有数据.
有没有办法解决这种行为,只监听child_added
事件.此外,像转储初始数据集这样的解决方法不是解决方案(想象一下拥有超过一百万个数据点的数据集 - 我不希望每个数据点都只是为了在添加一个数据点时进行监听!).
编辑:Firebase.on('child_added')
可以结合使用limit()
来限制初始请求产生的数据量.可能对我的应用程序来说,在某个时间点只会向Firebase添加一个数据点,因此我使用了Firebase.limit(1).on('child_added')
哪个数据点来限制加载到单个数据点的初始数据量.但是,我不喜欢这种解决方法有两个原因:
limit(1)
限制应用程序接收所有添加的子项?我不确定是否是这种情况,或者是否child_added
会为每个添加的孩子调用,无论他们是否作为批次添加.似乎提供一个true/false
标志作为调用的参数将是一个很好的解决方案,但我会等待,看看是否有一个我一直在掩饰的答案...
我正在尝试清理我的构建系统,我想在这样做时使用firebase-tools ( Firebase-hosted docs ) 模块。在 CLI 中使用该包的文档已经足够好了,但是将它用作节点模块的文档很少(而且深入了解包的源代码也不是很简单)。
在撰写本文时,以下是相关文档(仅出现在 GH 存储库中):
Firebase CLI 也可以以编程方式用作标准 Node 模块。这只能在您的机器上完成,不能在 Cloud Functions 中完成。每个命令都作为一个函数公开,该函数接受一个选项对象并返回一个 Promise。例如:
var client = require('firebase-tools');
client.list().then(function(data) {
console.log(data);
}).catch(function(err) {
// handle error
});
client.deploy({
project: 'myfirebase',
token: process.env.FIREBASE_TOKEN,
cwd: '/path/to/project/folder'
}).then(function() {
console.log('Rules have been deployed!')
}).catch(function(err) {
// handle error
});
Run Code Online (Sandbox Code Playgroud)
如您所见,只包含了两个非常基本的示例,并且没有说明可以提供给每个命令的各种选项。
例如,CLI 使用--only
标签(例如,--only database
如果只想推送新规则)。如果我只想部署规则,我是否包括only: "database"
在选项中?
示例中的输出确实吹嘘“规则已部署!” 成功消息,但提供的选项deploy
似乎没有表明这只会推动规则(而不是没有--only
选项的完整部署)!
额外问题:如果我的规则文件与我想要托管的文件有不同的路径怎么办?我只看到cwd
示例中提供了一个选项。
一些更清晰的文档在这里会有很长的路要走:)
RoR很好,但有时让我想把头靠在墙上(无论如何这可能是我的错).我只是尝试安装Thin
web-client gem,当我运行时sudo gem install thin
,我收到以下错误(它需要先安装eventmachine gem):
sudo gem install thin
Fetching: eventmachine-1.0.1.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing thin:
ERROR: Failed to build gem native extension.
/usr/bin/ruby1.9.1 extconf.rb
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)
from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from extconf.rb:2:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我已经搜索了"无法加载此类文件 - mkmf"错误,但大多数问题似乎都围绕着这样一个事实:它在1.8-dev中可用但不是1.8,但是当我运行1.9.3时我认为我有mkmf - 我验证了locate mkmf
:
/home/ubuntu/.rvm/rubies/ruby-1.9.3-p362/lib/ruby/1.9.1/mkmf.rb
Run Code Online (Sandbox Code Playgroud)
mkmf所在的目录显然不在/ usr/lib/ruby/...目录下 - 我不确定这是否是我的问题,但它可能足以启动你们中的一位专家作为到底发生了什么以及解决方案可能是什么.
另外,我使用RVM安装ruby 1.9.3而不仅仅是gem install
...
提前致谢!
我正在创建一个 Web 应用程序,使用 Firebase 作为数据存储、实时更新和托管的后端。
将大多数东西移到客户端是非常巧妙的,但安全问题是一个需要解决的重要问题。
对于访问 Firebase 上的数据,Firebase 安全规则会处理大部分事情。但是,当使用 Firebase 进行托管时,我觉得访问某些路由缺乏安全性。
目前,在页面加载时,我可以检查用户是否登录。如果用户未登录(或者身份验证令牌无效),我可以将用户重定向到不同的页面(即登录页面)。但是,我的问题是,如果该页面的静态 html 中嵌入了我不希望未经授权的用户看到的信息,该怎么办?
我觉得我收到的第一个答案是,“数据应该保存在 Firebase 变量中,只有在授权成功时才加载。” 虽然这是一个有效的选择,但我认为将 HTML(甚至只是文本段落)存储为 Firebase 变量是很麻烦的,应该有更好的方法。
最初我认为这将是firebase.json
文件中的一个固有选项,因为可以定义重定向、标头等。但是,没有任何firebase.json
安全性(如 in firebase-security.json
)可以让我执行如下auth
检查:
{
"firebase": "myfirebase",
"public": "app",
"ignore": [],
"rules": "config/security-rules.json",
"routes": [ {
"source" : "/for_authorized_only/",
"destination": "/authorized_page.html",
"auth": true, //Must be authorized
}, {
"source": "/some_public_route",
"destination": "index.html",
"auth": false, //No auth required to access this page
} ]
}
Run Code Online (Sandbox Code Playgroud)
我还没有尝试过 AngularJS 或 AngularFire,但经过一番搜索后,似乎 angularFire-seed 项目包括路由安全性,但是这应该包含在 Firebase …
简而言之,我想在本地测试Firebase 功能,特别是从实时数据库 trigger 触发的功能。根据本地测试的文档,似乎有两种方法可以完成 Firebase 功能的本地测试:
firebase emulators:start --only functions
)firebase functions:shell
)首先,至少在链接指南中,两者之间的差异非常不清楚。对于阅读本文的 Firebase 人员来说,此处的文档更新会很棒(考虑到对这些内容的本地测试是如此重要的功能)。
我对这个问题的关注(关于我尝试过的)是基于模拟器的,即因为它提到了“与其他服务的交互”。有趣的是,那里的列表只包括两个项目:
实时数据库有一个明显的遗漏,也许这就是差距所在,但我们走了。
我的函数看起来像这样:
console.log("Hello World")
exports.myDatabaseTrigger = functions.database.ref('/a/path/{id}').onCreate((data, context) => {
console.log(`myDatabaseTrigger triggered - here's my path ${data.ref.path}`);
//manipulate some other stuff in the DB
})
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我同时使用函数和实时数据库,所以我运行命令firebase emulators:start
并启动两个模拟器。
在 Postman 中,我使用本地实时数据库 REST API使用以下参数发布一些数据:
POST
http://localhost:9000/a/path.json
{
"some": "data"
} …
Run Code Online (Sandbox Code Playgroud) firebase firebase-tools firebase-realtime-database google-cloud-functions
firebase ×6
javascript ×3
buttongroup ×1
checkbox ×1
eventmachine ×1
java ×1
jquery ×1
mkmf ×1
ruby ×1
session ×1
uri ×1