Облачные функции Firebase не работают после перехода на машинопись - PullRequest
0 голосов
/ 24 марта 2020

Недавно я попытался перенести свои облачные функции Firebase с javascript на набор текста и разделить функции на несколько файлов. Тем не менее, я получаю ошибки при попытке обслуживать, а также развертывать:

Ошибки при обслуживании:

functions [functionName]: функция игнорируется, потому что эмулятор firestore не существует или не работает. functions [functionName]: функция игнорируется, потому что эмулятор firebase не существует или не работает.

Ошибка при развертывании :

functions[dataDownload(us-central1)]: Deployment error.
Function failed on loading user code. Error message: Code in file lib/index.js can't be loaded.
Is there a syntax error in your code?
Detailed stack trace: /srv/node_modules/fs-extra/lib/mkdirs/make-dir.js:86
      } catch {
              ^

SyntaxError: Unexpected token {
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:617:28)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/srv/node_modules/fs-extra/lib/mkdirs/index.js:3:44)

Пробовал:
Эмулятор Firestore / Firebase не работает (установлены эмуляторы, эмуляторы инициализации Firebase)
невозможно разделить функции Firebase на несколько файлов
Локальное восстановление Firestore с реальной базой данных: эмулятор Cloud Firestore не работает, поэтому операции с базой данных завершатся с ошибкой «учетные данные по умолчанию»
https://github.com/firebase/functions-samples/issues/170#issuecomment -586019131
How структурировать облачные функции для Firebase для развертывания нескольких функций из нескольких файлов?
https://javebratt.com/functions-multiple-files/
https://firebase.google.com/docs/functions/typescript#migrating_an_existing_javascript_project_to_typescript

Моя структура каталогов:

--functions
    -- lib
    -- node_modules
    -- src
        -- config
        -- admin.ts
        -- index.ts
        -- dataDownload.ts
    -- tsconfig.json
    -- tslint.json
    -- package.json
    -- package-lock.json

--.firebaserc
-firebase.json
--package.json
--package-lock.json

Файлы:
index.ts:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);

import { dataDownloadHandler } from './dataDownload';
export const dataDownload = functions.firestore.document('user/{uid}/download/{downloadId}').onCreate((snapshot, context) => {
    dataDownloadHandler(snapshot, context);
});

dataDownload.ts:

/* 
imports
*/
export const dataDownloadHandler = (snapshot:any, context:any) => {
    // code
}

Также не сработало, когда я переместил функцию dataDownload в файл dataDownload.ts и сделал export * from './dataDownload; в * 10 58 *.

admin.ts:

import * as admin from 'firebase-admin';

const auth = admin.auth();
const rtDb = admin.database();
const fsDb = admin.firestore();
const firebaseTimestamp = admin.database.ServerValue.TIMESTAMP;
const firestoreTimestamp = admin.firestore.FieldValue.serverTimestamp();

export { admin, auth, rtDb, fsDb, firebaseTimestamp, firestoreTimestamp };

пакет. json:

{
  "name": "functions",
  "engines": {
    "node": "8"
  },
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "watch": "tsc --watch",
    "serve": "npm run build && firebase serve --only functions -P staging",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "npm run build && firebase deploy --only functions",
    "logs": "firebase functions:log -P staging"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "^8.10.0",
    "firebase-functions": "^3.5.0",
    ...other dependencies
  },
  "devDependencies": {
    "eslint": "^5.16.0",
    "eslint-plugin-promise": "^4.2.1",
    "tslint": "^6.1.0",
    "typescript": "^3.8.3"
  },
  "private": true
}

firebase. json:

{
  "database": {
    "rules": "database.rules.json"
   },
  "hosting": [
   ...],
  "storage": {
    "rules": "storage.rules"
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ],
    "source": "functions"
  },
  "emulators": {
    "functions": {
      "port": 5001
    },
    "firestore": {
      "port": 8080
    },
    "database": {
      "port": 9000
    },
    "hosting": {
      "port": 5000
    }
  }
}

tsconfig . json:

{
  "compilerOptions": {
    "allowJs": true,
    "module": "commonjs",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "outDir": "lib",
    "sourceMap": true,
    "strict": true,
    "target": "es2017"
  },
  "compileOnSave": true,
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
      "node_modules"
  ]
}

РЕДАКТИРОВАТЬ : https работают облачные функции; Облачные функции firestore и database этого не делают.

Ответы [ 2 ]

4 голосов
/ 07 апреля 2020

Если вы используете "fs-extra": "^9.0.0", попробуйте перейти на версию 8.1.0.

Это устранило проблему для меня.

0 голосов
/ 24 марта 2020

Я пытался воспроизвести его из ваших примеров кода, но все было развернуто правильно.

В соответствии с этим do c (вы также упомянули) lib / index. js is:

Во время развертывания firebase index.ts вашего проекта переносится в index. js, то есть журнал функций облака будет выводить номера строк из файла индекса. js а не код, который вы написали. Чтобы вам было легче находить соответствующие пути и номера строк в index.ts

Итак, я полагаю, вам следует проверить, что там происходит, как эти файлы выглядят на вашей стороне. Может быть, вы сможете понять это.

Также я нашел такие вопросы, которые могут оказаться полезными:

{ ссылка }: //stackoverflow.com/questions/59432047/firebase-deploy-cant-find- serviceaccountkey

Проверьте, не относятся ли ваши ссылки к локальным файлам, и, возможно, вы можете попытаться воссоздать свой проект локально, а затем развернуть. Я надеюсь, что это будет полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...