Firebase 函数模拟器错误:找不到模块“../service-account.json”

Posted

技术标签:

【中文标题】Firebase 函数模拟器错误:找不到模块“../service-account.json”【英文标题】:Firebase Functions emulator Error: Cannot find module '../service-account.json' 【发布时间】:2021-05-24 22:42:43 【问题描述】:

我正在尝试使用 firebase emulators:exec 执行测试函数,模拟器成功启动但由于以下错误而无法加载函数代码

Error: Cannot find module '../service-account.json'

我已经多次执行 npm install、npm run-script lint、npm run-script build 等,还擦除了我的 node_modules 文件夹并再次运行 npm install,以及重新启动 vscode,但我反复收到错误消息。

我有一个函数文件夹,其中 service-account.json 位于:

├─ firebase.json
├─ firestore.indexes.json
├─ firestore.rules
├─ functions
│  ├─ .eslintrc.json
│  ├─ .gitignore
│  ├─ firestore-debug.log
│  ├─ lib
│  ├─ node_modules
│  ├─ package-lock.json
│  ├─ package.json
│  ├─ pubsub-debug.log
│  ├─ src
│  │  ├─ controller
│  │  │  ├─ functions
│  │  │  └─ shared.ts
│  │  ├─ index.ts
│  │  ├─ model
│  │  ├─ play-billing
│  │  ├─ service-account-firebase.json
│  │  ├─ service-account.json
│  │  └─ typings.d.ts
│  ├─ test
│  ├─ tsconfig.dev.json
│  └─ tsconfig.json
├─ gradle

service-account.json 应该从 shared.ts 文件中访问:

import * as functions from "firebase-functions";
import  PlayBilling  from "../play-billing";

import * as serviceAccountPlay from "../service-account.json";
import  InstanceIdManager  from "../model/InstanceIdManager";
import  ContentManager  from "../model/ContentManager";

/*
 * This file defines shared resources that are used in functions
 */

// Shared config
export const PACKAGE_NAME = functions.config().app.package_name;
...

我通过将鼠标悬停在文件上仔细检查了文件的路径是否正确,它正确显示了完整路径。 我检查了我的依赖项,一切似乎都已到位:

├── @types/chai@4.2.15
├── @types/mocha@8.2.1
├── @types/node@14.14.31
├── @typescript-eslint/eslint-plugin@4.15.1
├── @typescript-eslint/parser@4.15.1
├── chai@4.3.0
├── copyfiles@2.4.1
├── eslint-plugin-import@2.22.1
├── eslint-plugin-promise@4.3.1
├── eslint@7.20.0
├── express@4.17.1
├── firebase-admin@9.5.0
├── firebase-functions-test@0.2.3
├── firebase-functions@3.13.1
├── googleapis@67.1.0
├── mocha@8.3.0
├── ts-node@9.1.1
└── typescript@4.1.5

我特别困惑,因为我在另一个项目中具有完全相同的结构、依赖项和函数代码,它工作正常!

我错过了什么? 我搜索了其他答案,但找不到任何我尚未检查的内容。

请注意,service-account.json 与我在另一个项目中使用的完全相同,在该项目中我能够毫无问题地模拟测试功能。

更新 删除我的 lib 文件夹并重建它后,我现在在模拟器加载我的函数代码时遇到了另一个错误:

It looks like you're trying to access functions.config().app but there is no value there.

我的 tsconfig.json 现在在左大括号上显示错误:

Cannot find type definition file for 'express-serve-static-core 2'

但我看不出有什么问题。


  "compilerOptions": 
    "lib": [
      "es6",
      "ESNext.AsyncIterable"
    ],
    "module": "commonjs",
    "noImplicitReturns": true,
    //"noUnusedLocals": true,
    "outDir": "lib",
    "sourceMap": true,
    //"strict": true,
    "target": "es6",
    "resolveJsonModule": true,
    "esModuleInterop": true
  ,
  "compileOnSave": true,
  "include": [
    "src",
    "test",
    "./typings.d.ts",
  ]

我的lib文件结构如下:

.
├── src
│   ├── controller
│   ├── index.js
│   ├── index.js.map
│   ├── model
│   ├── play-billing
│   ├── service-account-firebase.json
│   └── service-account.json
└── test
    └── play-billing

【问题讨论】:

你的 tsconfig 中有 resolveJsonModule:true 吗? @ZdravkoDanev - 谢谢,是的,我在 tsconfig 中有 resolveJsonModule:true。 【参考方案1】:

我最终解决了以下所有问题:

首先,我删除了整个lib 文件夹,然后运行 npm run-script build 构建一个新的 lib 文件夹。

这修复了模拟器查找模块'...service-account.json'的错误

我在查找 index.js 时出错,我通过更正 package.json 文件中的一个错误来解决这个问题,因为路径 "main" 到 index.js

我仍然无法从模拟器运行我的函数 - 我发现解决方案是在我的项目的函数目录中运行以下命令。

firebase functions:config:get > .runtimeconfig.json

(在此处查看此答案:https://***.com/a/42978220/15046746)

现在当我运行firebase emulators:start 时,我的所有函数都已正确初始化,并且我可以运行emulators:exec 来运行模拟器中的所有测试函数。

【讨论】:

很高兴听到您的问题得到解决。请考虑接受您自己的答案,以便有类似问题的社区可以按照您的步骤操作。【参考方案2】:

如果我阅读此内容正确,您的服务帐户文件位于 src/ 目录中。但是一旦构建了函数,编译后的代码就会部署到lib/ 目录。那里你的相对路径不再有效。

【讨论】:

是的,你是对的,服务帐户文件在src/ 目录中,但是在 npm run-script build 之后它也在lib/ 目录中。我已删除 lib 文件夹并重新构建它,之后我不再因查找服务帐户而出错,而是在查找 index.js 时出错。查看我的 package.json,我有 ' "main": "lib/index.js" ',我认为这可能是问题并更改为 ' "lib/src/index.js" ' 但现在我收到一个错误for '看起来你正在尝试访问 functions.config().app 但那里没有任何价值。' 正如我提到的,我有另一个具有相同结构和功能的项目,我可以模拟它 - 仔细查看该项目中的 lib 文件结构,我可以看到所有文件是重复的,即functions文件夹中的所有文件和文件夹都直接在lib文件夹中,也在lib/src文件夹中!不知道为什么会这样。我的“问题”项目 lib 文件夹包含与函数文件夹中结构相同的所有文件和文件夹,没有任何重复...

以上是关于Firebase 函数模拟器错误:找不到模块“../service-account.json”的主要内容,如果未能解决你的问题,请参考以下文章

错误:使用节点命令运行 JS 文件时找不到模块“firebase”

使用 Typescript 创建 Firebase 云函数时出现“找不到名称‘ServiceWorkerRegistration’”错误

部署 firebase 项目时错误显示“找不到模块 firebase-functions”

致命错误:找不到模块“firebase_core”

颤振:致命错误:找不到模块“firebase_analytics”

致命错误:找不到模块“firebase_auth”@import firebase_auth