Firebase在国内有些地区是可用的,但只是有些,没法保证全国通用,这篇文章谈的是服务端(Node.js)的使用。
前提是电脑跑起来了代理软件,这个怎么搞我就不说了,代理服务器方面我建议用香港的代理服务器,那就很快很稳了。
首先是Firebase-tool这个命令行工具,源码中使用的是request这个库,所以只要在源码里头加上proxy
属性就行了。
目前版本来说这个文件是api.js
,找到_request
这个函数,在里头加上一句:
options.proxy = "http://127.0.0.1:8118";
比较麻烦的是Firbase-admin这个库,用的是原生的http/https这两个核心的,核心服务都是走https的,所以这篇文章主要就谈一谈原生库如何走代理。我已经将这个库整理到firebase-admin-proxyable这里了,国内用户可以安装这个并看着文档中DEMO的写法来配置自己的代理。
核心原理就是使用agent这个属性,具体看官方文档。
在npm里头,绝大多数的代理,核心都是这个库:tunnel-agent,点链接进去没文档,没关系,直接看源码,源码就单文件不到300行。
然后推荐用caw这个库。源码也是很简单的,读过觉得很靠谱,所以才在这里推荐使用。
以上就是相关的核心基本知识了。
下面是实践:
第一步
const caw = require('caw');
const https = require("https");
https.globalAgent = caw("http://127.0.0.1:8118", {
protocol: 'https'
});
设置全局代理,agent的只有在keep-alive的情况下才会自动触发,去使用globalAgent。
注意,这里:
"http://
这个代理的协议头不能少,看源码就知道为什么,因为源码很精简,没有去做那些不必要的智能判断,所以包括后面的protocol: 'https'
也不能少,这点很重要。
第二步
const admin = require("./firebase-admin");
要把node_modules里头的firebase-admin文件夹拿出来,改源码,当然你也可以手动去跟随维护一个走代理版本的库。
第三步
找到api-request.js文件中https请求的options的定义,添加以下属性。
// firebase-admin\lib\utils\api-request.js
| var options = {
| method: httpMethod,
| host: host,
| port: port,
| path: path,
| headers: headers,
+| agent: https.globalAgent,
| };
找到credential.js文件中requestAccessToken函数,在函数头部添加以下代码
// firebase-admin\lib\auth\credential.js
|function requestAccessToken(transit, options, data) {
+| if(transit === https){
+| options.agent = https.globalAgent;
+| }
| return new Promise(function (resolve, reject) {
2017-8-2补充:
上面说的代理,是针对Google身份校验方面的代理。而在身份校验通过后,就是要开始用wss
协议连接到服务器了,这点我补充一下如何配置:
在源码中有这么一段:
0 == this.Wd.indexOf("wss://") ? d.HTTPS_PROXY || d.https_proxy : d.HTTP_PROXY || d.http_proxy;
意思是,wss的代理走的不是nodejs的,而是自己的一套,默认从命令行的环境中获取代理参数,所以如果wss连接不稳定,需要走代理的话:
set https_proxy=http://127.0.0.1:8118
注意,这里头http://
这个协议前缀一定要加。