node.js - Firebase Functions ემულატორი შეცდომა: მოდული '../service-account.json' ვერ მოიძებნა
ვცდილობ, შევასრულო ტესტის ფუნქციები 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, მაგრამ არაერთხელ მიმაჩნია შეცდომა.
მე მაქვს functions ფოლდერი, რომელშიც მდებარეობს 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/[email
├── @types/[email
├── @types/[email
├── @typescript-eslint/[email
├── @typescript-eslint/[email
├── [email
├── [email
├── [email
├── [email
├── [email
├── [email
├── [email
├── [email
├── [email
├── [email
├── [email
├── [email
└── [email
მე განსაკუთრებით დავიბენი, რადგან მე მაქვს ზუსტად ერთი და იგივე სტრუქტურა, დამოკიდებულებები და ფუნქციური კოდი სხვა პროექტში, სადაც ყველაფერი კარგად მუშაობს!
რას ვკარგავ? მე ვეძებე სხვა პასუხებში და ვერ ვპოულობ არაფერს, რაც უკვე არ შემოწმებია.
შენიშნეთ, რომ 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",
]
}
ჩემი ბიბლიოთეკის ფაილური სტრუქტურა შემდეგია:
.
├── src
│ ├── controller
│ ├── index.js
│ ├── index.js.map
│ ├── model
│ ├── play-billing
│ ├── service-account-firebase.json
│ └── service-account.json
└── test
└── play-billing
პასუხი #1
მე საბოლოოდ გავმართე ჩემი ყველა პრობლემა შემდეგნაირად:
პირველ რიგში, მე წავშალე მთელი lib ფოლდერი, შემდეგ კი გავუშვი npm run-script build ახალი lib ფოლდერის შესაქმნელად.
ეს გამოსწორდა შეცდომა ემულატორებისთვის, რომ ესოდენიონ მოდული '...service-account.json'
მაპი მაქვს შეცდომა index.js-ის მოძებნაში, რომელიც დავარეგულირე package.json ფაილში შეცდომის შესწორებით, "main" ტრასის შემთხვევაში index.js-ამდე
მიმინანებლად ვერ შევძელი ჩემი ფუნქციების ამულატორებიდან გაშვება - აღმოვაჩინე, რომ პრობლემის გადაჭრა იყო შემდეგი ბრძანების გაშვება ჩემი პროექტის ფუნქციების დირექტორიაში.
firebase functions:config:get > .runtimeconfig.json
(იხილეთ ეს პასუხი აქ: https://stackoverflow.com/a/42978220/15046746)
ახლა, როცა ვაკონტროლებ firebase emulators:start, ყველა ჩემი ფუნქცია სწორად ინიშნება, ასევე შემიძლია გავუშვა emulators:exec ყველა ტესტის ფუნქციის გასაშვებად ემულატორში.
პასუხი #2
თუ ვკითხულობ სწორად, თქვენი სერვისის ანგარიშის ფაილი src/ დირექტორიაშია. მაგრამ როცა თქვენი ფუნქცია შეიქმნება, კომპილირებული კოდი განთავსდება lib/ დირექტორიაში. იქ თქვენი უკ_relative გზა აღარ იქნება ვალიდური.
