Не удается развернуть проект nest.js в Google Firebase Functions

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"
  ]
}

Что не так?

Я не уверен, что случилось, но можете ли вы попробовать выполнить развертывание в среде выполнения бета-версии Node 8 и посмотреть, сохраняется ли проблема? (измените конфигурацию babel и typescript, чтобы настроить таргетинг на нее)

swigganicks 26.07.2018 23:44

Он работает на узле 8. Проблема заключается в переносе на узел v6: / Если вы загрузите простое приложение helloworld с использованием последней версии nestjs, а затем попытаетесь развернуть его в облаке Firebase, вы увидите ошибку при развертывании.

Antonio 27.07.2018 10:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
1 101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Узел 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.

Antonio 25.07.2018 09:29
Ответ принят как подходящий

Ровно 3 дня назад (после конференции Next conf Google Cloud) Google только что анонсировал новую среду выполнения Node 8, а также инструменты Firebase Cloud Functions 2.0.0 и Firebase до версии 4.0.0.

Вот что вам нужно сделать, чтобы сесть на поезд Node 8:

  1. Обновите ваш firebase-functions version до 2.0.0
  2. Обновите firebase-tools до 4.0.0
  3. Добавьте "двигателей": { “node": “8” } к вашему /functions/package.json

Подробнее здесь: https://firebase.google.com/docs/functions/manage-functions#set_nodejs_version

Другие вопросы по теме