Функции Firebase не могут быть развернуты.Неожиданная функция токена - PullRequest
0 голосов
/ 24 октября 2018

Хорошо, поэтому я только что узнал, что функции firebase поддерживают узел 8, потому что я получаю сообщение об ошибке «Неожиданные функции токена», где первый «асинхронный».

Google говорит, поместите это в пакет json.

"engine": {"node": "8"}

но я положил его туда, и он ничего не делает.Кто-нибудь из вас знает, что не так?

package.json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "dependencies": {
    "firebase-admin": "~6.1.0",
    "firebase-functions": "^2.0.3"
  },
  "engines": {"node": "8"},
  "devDependencies": {
    "eslint": "^5.7.0",
    "eslint-plugin-promise": "^4.0.1"
  },
  "private": true
}

index.js

const functions = require('firebase-functions');
const request = require('request');
const admin = require('firebase-admin');
const serviceAccount = require("./service-key.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "*"
});

exports.helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello from Firebase!");
});

exports.getEvents = functions.https.onRequest(() => {
    request.get('*', (error, response, body) => {
        console.log('error:', error);
        console.log('statusCode:', response && response.statusCode);
        console.log('body:', body);

        var data = { "events": body };

        function isCollection(data, path, depth) {
            if (
              typeof data != 'object' ||
              data == null ||
              data.length === 0 ||
              isEmpty(data)
            ) {
              return false;
            }

            for (const key in data) {
              if (typeof data[key] != 'object' || data[key] == null) {
                // If there is at least one non-object item then it data then it cannot be collection.
                return false;
              }
            }

            return true;
          }

          // Checks if object is empty.
          function isEmpty(obj) {
            for(const key in obj) {
              if(obj.hasOwnProperty(key)) {
                return false;
              }
            }
            return true;
          }

          async function upload(data, path) {
            return await admin.firestore()
              // .collection('/lineup2018')
              .doc(path.join('/'))
              .set(data)
              .then(() => console.log(`Document ${path.join('/')} uploaded.`))
              .catch(() => console.error(`Could not write document ${path.join('/')}.`));
          }

          /**
           *
           */
          async function resolve(data, path = []) {
            if (path.length > 0 && path.length % 2 == 0) {
              // Document's length of path is always even, however, one of keys can actually be a collection.

              // Copy an object.
              const documentData = Object.assign({}, data);

              for (const key in data) {
                // Resolve each collection and remove it from document data.
                if (isCollection(data[key], [...path, key])) {
                  // Remove a collection from the document data.
                  delete documentData[key];
                  // Resolve a colleciton.
                  resolve(data[key], [...path, key]);
                }
              }

              // If document is empty then it means it only consisted of collections.
              if (!isEmpty(documentData)) {
                // Upload a document free of collections.
                await upload(documentData, path);
              }
            } else {
              // Collection's length of is always odd.
              for (const key in data) {
                // Resolve each collection.
                await resolve(data[key], [...path, key]);
              }
            }
          }

          resolve(data);
    });
});

РЕДАКТИРОВАТЬ: выясняется, что функция работает на node.jsно я все еще получаю ошибку из-за асинхронности и ожидания.Может быть, эслинт делает что-то странное.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Если вы хотите выполнить развертывание на узле 8, вам также необходимо использовать узел 8 (или более поздний) для развертывания ваших функций, так как синтаксис ваших функций проверяется CLI перед загрузкой.

Makeубедитесь, что node --version для вашей оболочки показывает, что узел 8 используется локально.

Кроме того, вам, возможно, придется сначала удалить свою функцию, прежде чем изменять ее среду выполнения при развертывании.

0 голосов
/ 24 октября 2018

Firebase Functions по-прежнему использует Node.js 6.x ( Google Cloud Functions Node.js 6 Runtime ).Так что async/await ключевые слова в данный момент недоступны в Firebase Functions.

Вот бета-программа для Node.js 8, где вы можете использовать async/await.

...