NestJs использует ES6, ES7 и ES8, но функции Firebase застряли на Node v.6.11.
Я попытался написать файл конфигурации webpack с babel для переноса моих файлов и node_modules на узел v6.11, но я не могу завершить развертывание из-за синтаксической ошибки, вызванной функцией async в @ nestjs / common Файл /interceptors/file-fields.interceptor.js.
⚠ functions[api]: Deployment error.
Function load error: Code in file dist/index.js can't be loaded.
Is there a syntax error in your code?
Detailed stack trace: /user_code/node_modules/@nestjs/common/interceptors/file-fields.interceptor.js:10
async intercept(context, call$) {
^^^^^^^^^
SyntaxError: Unexpected identifier
at createScript (vm.js:56:10)
at Object.runInThisContext (vm.js:97:10)
at Module._compile (module.js:549:28)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/user_code/node_modules/@nestjs/common/interceptors/index.js:6:10)
Вот мой файл webpack.config.js:
'use strict';
const nodeExternals = require('webpack-node-externals');
module.exports = {
entry: './src/server.ts',
output: {
filename: 'index.js',
libraryTarget: 'this'
},
target: 'node',
module: {
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'babel-loader',
options: {
presets: [
[
'@babel/preset-env',
{
"targets": {
"node": "6.11.1"
}
},
'@babel/stage-0'
]
],
plugins: [require('@babel/plugin-transform-async-to-generator')]
}
},
{
loader: 'ts-loader',
options: {
transpileOnly: true
}
}
]
},
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: {
presets: [
[
'@babel/preset-env',
{
"targets": {
"node": "6.11.1"
}
},
'@babel/stage-0'
]
],
plugins: [require('@babel/plugin-transform-async-to-generator')]
}
}
]
}
]
},
resolve: {
extensions: [ '.ts', '.tsx', '.js' ]
},
externals: [nodeExternals()]
};
Мой tsconfig.json:
{
"compilerOptions": {
"lib": ["es6", "es2015.promise"],
"module": "commonjs",
"noImplicitAny": false,
"outDir": "",
"sourceMap": true,
"removeComments": true,
"noLib": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowJs": true,
"target": "es6",
"typeRoots": [
"node_modules/@types"
]
},
"include": [
"src/**/*.ts",
"spec/**/*.ts"
],
"exclude": [
"**/*.spec.ts"
]
}
Что не так?
Он работает на узле 8. Проблема заключается в переносе на узел v6: / Если вы загрузите простое приложение helloworld с использованием последней версии nestjs, а затем попытаетесь развернуть его в облаке Firebase, вы увидите ошибку при развертывании.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Узел 6 не будет запускать какой-либо код с ключевым словом async, поскольку он выполняет асинхронные функции не поддерживает из ES2017.
Я бы рекомендовал попробовать использовать TypeScript для транспиляции вашего кода, используя es6 в качестве target в вашем tsconfig.json. Он должен переносить асинхронные функции. Имейте в виду, что вам может потребоваться загрузить определенные полифиллы в зависимости от ваших потребностей. И вы, вероятно, знаете об этой детали, но NestJS указывает Node 8.9+, как описано в здесь:
We follow the Node.js release schedule which recently moved to 8.x as an active LTS version. Therefore, Nest 5 supports >= 8.9.0 as the lowest version now. This shift gaves us sustainable performance boosts thanks to the es2017 target of the TypeScript compilation.
Я уже использую ts-loader (с es6 в качестве цели) для преобразования файлов машинописного текста + babel 7 w / preset-env, предназначенного для node v6.
Ровно 3 дня назад (после конференции Next conf Google Cloud) Google только что анонсировал новую среду выполнения Node 8, а также инструменты Firebase Cloud Functions 2.0.0 и Firebase до версии 4.0.0.
Вот что вам нужно сделать, чтобы сесть на поезд Node 8:
firebase-functions version до 2.0.0firebase-tools до 4.0.0{ “node": “8” } к вашему /functions/package.jsonПодробнее здесь: https://firebase.google.com/docs/functions/manage-functions#set_nodejs_version
Я не уверен, что случилось, но можете ли вы попробовать выполнить развертывание в среде выполнения бета-версии Node 8 и посмотреть, сохраняется ли проблема? (измените конфигурацию babel и typescript, чтобы настроить таргетинг на нее)