我有一个项目,使用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部署时忽略了引擎设置?
答案 0 :(得分:1)
Firebase工具将解析您的代码,以查找函数触发器名称,并且看起来就是触发的地方。
我的猜测是您的自定义容器gcr.io/[PROJECT_NAME]/firebase
运行的Node版本与ES2017 / ES8 async/await
关键字不兼容。
您需要确保您的容器至少运行Node v7.6.0。
希望这会有所帮助。