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”