节点8 Firebase功能无法从CloudBuild部署

时间:2018-10-22 14:25:43

标签: firebase google-cloud-functions google-cloud-build

我有一个项目,使用Node 8引擎从本地开发环境到Firebase成功部署到了Firebase功能。我一直在尝试使其与CloudBuild一起使用,但是由于使用async关键字,出现语法错误:

public class MainActivity extends AppCompatActivity{

    String TAG = "111232312312";
    MyJavaScriptInterface MJInterface = new MyJavaScriptInterface();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final WebView simpleWebView=(WebView) findViewById(R.id.wvBrowser);
        simpleWebView.getSettings().setJavaScriptEnabled(true);
        simpleWebView.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36");
        simpleWebView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                // do your stuff here
                String cookies = CookieManager.getInstance().getCookie(url);
                Log.d(TAG, url+ " All the cookies in a string:" + cookies);
                simpleWebView.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");

                Log.d(TAG, "[[[" + MJInterface.htmlString + "]]]");
            }
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                Log.d(TAG, "ERROR");
                super.onReceivedError(view, request, error);
            }
        });
        simpleWebView.addJavascriptInterface(MJInterface, "HTMLOUT");
        simpleWebView.loadUrl("https://www.youtube.com");
    }

    class MyJavaScriptInterface {
        public String htmlString = "";
        @JavascriptInterface
        public void showHTML(String html) {
            htmlString = html;
            Pattern p = Pattern.compile("data-sitekey=(.*?)\"><");
            Matcher m = p.matcher(htmlString);
            while(m.find()) {
                Log.d(TAG,m.group(0));
                Log.d(TAG,m.group(1));
            }
        }
    }
}

表明节点引擎不支持异步/等待,即不支持节点8。该引擎在package.json中设置,可以在我的本地环境中工作。

/workspace/functions/lib/index.js:13
Step #5: app.get('XXXXXXXXX', async (req, resp) => {
Step #5: ^
Step #5: 
Step #5: SyntaxError: Unexpected token (
Step #5: at createScript (vm.js:56:10)
Step #5: at Object.runInThisContext (vm.js:97:10)
Step #5: at Module._compile (module.js:549:28)
Step #5: at Object.Module._extensions..js (module.js:586:10)
Step #5: at Module.load (module.js:494:32)
Step #5: at tryModuleLoad (module.js:453:12)
Step #5: at Function.Module._load (module.js:445:3)
Step #5: at Module.require (module.js:504:17)
Step #5: at require (internal/module.js:20:19)
Step #5: at /usr/local/lib/node_modules/firebase-tools/lib/triggerParser.js:21:11

部署正在使用documentation中所述的firebase容器:

"engines": {
    "node": "8"
  }

CloudBuild是否可以部署到不支持Node8的Firebase功能的其他/内部端点上,从而静默降级?

或者还有其他我想念的东西吗?

我试图通过将.tsconfig更改为以es2015而不是es2017为目标来证明这一理论,并从package.json中删除了engine部分。结果是该功能已部署到Node8功能?

- name: 'gcr.io/[PROJECT_NAME]/firebase'
  args: [ 'deploy', '-P', 'prod', '-f', '--only', 'functions','--token', '${_FIREBASE_TOKEN}']

我认为这是因为已经存在节点8功能,所以它只是一个更新而不是创建,但是也许表明代码解析器基于node6并在通过cloudbuild部署时忽略了引擎设置?

1 个答案:

答案 0 :(得分:1)

Firebase工具将解析您的代码,以查找函数触发器名称,并且看起来就是触发的地方。

我的猜测是您的自定义容器gcr.io/[PROJECT_NAME]/firebase运行的Node版本与ES2017 / ES8 async/await关键字不兼容。

您需要确保您的容器至少运行Node v7.6.0。

希望这会有所帮助。