当前位置: 首页 > 知识库问答 >
问题:

迁移到typescript后Firebase云功能不工作

东方和惬
2023-03-14

最近,我尝试将firebase云函数从javascript迁移到typescript,并将函数拆分为多个文件。然而,我在尝试服务和部署时不断出错:

服务时的错误:

函数[FunctionName]:函数被忽略,因为fiRecovery模拟器不存在或未运行。函数[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 Emulator未运行(安装了模拟器,没有安装Firebase init模拟器)
无法在多个文件中拆分Firebase函数
Firestore本地http与真实数据库:云Firestore Emulator未运行,因此数据库操作将失败,出现“默认凭据”错误
https://github.com/firebase/functions-samples/issues/170#issuecomment-586019131
如何为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

文件:
索引。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);
});

数据下载。ts:

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

当我将dataDownload功能移到dataDownload中时,它也不起作用。ts文件,并从中导出/数据下载 索引中。ts

管理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 };

package.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数据库云功能没有。

共有2个答案

宗政德宇
2023-03-14

我试图从你的代码样本中复制它,但一切都得到了正确的部署。

根据这份文件(你也提到了)lib/index.js是:

在firebase部署期间,您的项目的索引。ts被传输到索引。js,这意味着云函数日志将从索引中输出行号。js文件,而不是您编写的代码。使您更容易在索引中找到相应的路径和行号。ts

所以我想你应该检查一下那里发生了什么,这些文件在你这边是什么样子的。也许你能弄明白。

我还发现了一些可能有用的问题:

类导入但仍然Firebase部署失败,找不到模块

Firebase部署找不到serviceAccountKey

检查您的引用是否不是本地文件,也许您可以尝试在本地重新创建项目,然后部署。我希望这会有帮助!

艾骏
2023-03-14

如果您使用的是“fs extra”:“^9.0.0”请尝试降级到版本8.1.0

这为我解决了问题。

 类似资料:
  • 我只是按照Firebase留档(https://firebase.google.com/docs/functions/typescript)为了将我的云函数项目迁移到打字稿,现在,我有以下错误,当我使用:'Firebase部署-只有函数' 以下是stacktrace: 我的tsconfig.json: 我的包裹。json:

  • 我构建了一些像这样的云函数: 它工作得很好,但我想把地区换成欧洲西部。我遵循了这个stackoverflow: Firebase部署到自定义区域(EU-中心1) 除了onCall函数,它看起来对所有函数(触发器)都工作正常。在客户端调用addRoom函数时,我得到了这个错误: 获取的权限'https://us-central1-myproject.cloudfunctions.net/addRoo

  • Angular 是使用 TypeScript 构建的,并且支持向 Angular 提供元信息的装饰器。 TypeScript 的装饰器会让语法感觉更加“自然”,尽管有可能使用 Angular 没有的功能。

  • TypeScript不是凭空存在的。 它从JavaScript生态系统和大量现存的JavaScript而来。 将JavaScript代码转换成TypeScript虽乏味却不是难事。 接下来这篇教程将教你怎么做。 在开始转换TypeScript之前,我们假设你已经理解了足够多本手册里的内容。 如果你打算要转换一个React工程,推荐你先阅读React转换指南。 如果你在写纯JavaScript,你大

  • 下面是我正在尝试使用firebase云功能所做的事情: -监听“用户”集合下的文档中的任何更改。 -更新“评论”和“发布”集合中相关文档中用户信息的副本。 因为我将需要在相关文档中进行查询并立即更新,所以我正在编写事务操作的代码。 这是我写的代码。它返回错误消息“Function returned undefined,expected Promise or value”。 我有点困惑,因为据我所知

  • 我是Android应用程序开发的新手,目前正在开发一个现有的Android应用程序。从Android文档链接https://developer.Android.com/distribute/best-practices/develope/target-sdk中可以看出,应用程序更新必须至少针对Android9.0。 因此,我将targetSDKVersion设置为28,并尝试运行应用程序,但res