firebase-admin-node icon indicating copy to clipboard operation
firebase-admin-node copied to clipboard

Cannot find module 'firebase-admin/app'

Open sankalpsans opened this issue 3 years ago • 36 comments

package.json requirements look like this –

  "dependencies": {
    "@sentry/node": "^5.30.0",
    "body-parser": "1.19.0",
    "express": "^4.17.1",
    "firebase-admin": "10.0.0",
    "mysql": "^2.18.1",
    "pug": "3.0.2"
  }

node_modules has the corresponding module in the path ~/node_modules/firebase-admin/lib/app

Node code reads as –

const initializeApp  = require('firebase-admin/app');

And when the app is run, the following stacktrace emerges.

 Error: Cannot find module 'firebase-admin/app'
     at Function.Module._resolveFilename (module.js:547:15)
     at Function.Module._load (module.js:474:25)
     at Module.require (module.js:596:17)
     at require (internal/module.js:11:18)
     at Object.<anonymous> (/var/www/html/project/backend/main.js:16:24)
     at Module._compile (module.js:652:30)
     at Object.Module._extensions..js (module.js:663:10)
     at Module.load (module.js:565:32)
     at tryModuleLoad (module.js:505:12)
     at Function.Module._load (module.js:497:3)

sankalpsans avatar Nov 07 '21 06:11 sankalpsans

I found a few problems with this issue:

  • I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.
  • This issue does not seem to follow the issue template. Make sure you provide all the required information.

google-oss-bot avatar Nov 07 '21 06:11 google-oss-bot

I have the same issue. For some reason, running npm install resolved the error when running mocha tests from a non-debug terminal instance in Visual Studio Code, but running mocha tests from a debug terminal instance still yields this error. The node_modules package is definitely installed.

shalomhalbert avatar Nov 07 '21 19:11 shalomhalbert

Solved it by ignoring the import recommendation. Instead of

'use strict';

const { initializeApp } = require('firebase-admin/app');
const { getFirestore, Timestamp, GeoPoint } = require('firebase-admin/firestore');

exports.initializeApp = () => initializeApp();
exports.getFirestore = () => getFirestore();
exports.Timestamp = Timestamp;
exports.GeoPoint = GeoPoint;

I am now using what existed before v10:

'use strict';

const firebaseAdmin = require('firebase-admin');

exports.initializeApp = () => firebaseAdmin.initializeApp();
exports.getFirestore = () => firebaseAdmin.firestore();
exports.Timestamp = firebaseAdmin.firestore.Timestamp;
exports.GeoPoint = firebaseAdmin.firestore.GeoPoint;

shalomhalbert avatar Nov 07 '21 19:11 shalomhalbert

Code given above worked fine when executed through Node.js 12. Here's the output of the execution with an added console.log statement:

% cat main.js 
'use strict';

const { initializeApp } = require('firebase-admin/app');
const { getFirestore, Timestamp, GeoPoint } = require('firebase-admin/firestore');

exports.initializeApp = () => initializeApp();
exports.getFirestore = () => getFirestore();
exports.Timestamp = Timestamp;
exports.GeoPoint = GeoPoint;

console.log(exports);


% node main.js 
{
  initializeApp: [Function],
  getFirestore: [Function],
  Timestamp: [class Timestamp],
  GeoPoint: [class GeoPoint]
}

Also I can do the following on a Node.js REPL:

% node
Welcome to Node.js v12.22.0.
Type ".help" for more information.
> const { initializeApp } = require('firebase-admin/app')
undefined
> initializeApp
[Function: initializeApp]

May be somebody can share a minimal and complete repro of the issue? Something that we can download and run to repro the problem?

hiranya911 avatar Nov 08 '21 08:11 hiranya911

@hiranya911 I am currently using node v17.0.1. Is it known to not work with this? Is the solution to downgrade to v12 instead?

Edit – I can confirm that downgrading to v12 did solve the issue.

sankalpsans avatar Nov 09 '21 02:11 sankalpsans

@shalbert94 Importing the top level module and then accessing internal things like you suggested works. That is exactly the workaround that I proceeded with.

So, either the docs need updating, or the library itself does.

sankalpsans avatar Nov 09 '21 04:11 sankalpsans

Works fine on Node 17 too:

$ node
Welcome to Node.js v17.0.1.
Type ".help" for more information.
> const { initializeApp }  = require('firebase-admin/app')
undefined
> initializeApp
[Function: initializeApp]

This is most likely a problem specific to your environment/implementation. We will need a complete, minimal repro to know for sure.

As fas as our library is concerned, we correctly declare the new module entry points in our package.json file:

https://github.com/firebase/firebase-admin-node/blob/b26501b023194b664df5d81f526e237f975fae71/package.json#L106-L111

All Node.js versions 12 and up, should support it.

hiranya911 avatar Nov 09 '21 06:11 hiranya911

Edit – I can confirm that downgrading to v12 did solve the issue.

Assuming there are no other libraries, frameworks or custom module loaders in play, more likely explanation is your Node 17 setup was somehow loading an old version of firebase-admin (e.g. v9), that didn't have the new module exports. Changing to Node 12 pulled in the latest version of the library, and picked up the new entry points. Just a guess.

hiranya911 avatar Nov 09 '21 06:11 hiranya911

I pushed a copy of my attempt to repro this issue to https://github.com/firebase/firebase-admin-node/tree/hkj-repro-1488/nodetest. Feel free to play with it and see if you can still repro the problem.

hiranya911 avatar Nov 09 '21 06:11 hiranya911

I'm also getting this error when using the snippet provided:

import { initializeApp, applicationDefault } from 'firebase-admin/app';

=> Error: Cannot find module 'firebase-admin/app'

Node v14.16.1

Confirming that using import firebaseAdmin from 'firebase-admin' resolves it, however that's a big headache. For now I've given up on this approach and gone back to using import Firestore from '@google-cloud/firestore' (and it looks like firebase-admin just wraps that anyway so no harm I guess?)

Bandit avatar Nov 09 '21 06:11 Bandit

@Bandit can you share a complete repro with us? Something similar to the complete example I've shared above in my last comment.

hiranya911 avatar Nov 09 '21 08:11 hiranya911

Folks who are seeing this error also please check their library version using one of the following methods:

Using npm ls

$ npm ls firebase-admin       
[email protected] 
└── [email protected]

Directly checking the package.json of the library

$ grep "version" node_modules/firebase-admin/package.json
  "version": "10.0.0"

If the version is indeed 10.x or higher, please share a complete repro that we can run.

hiranya911 avatar Nov 09 '21 08:11 hiranya911

Confirmed I'm using [email protected]

I'll see about building a repro when I get some time, but I'm assuming it's related to Vite (using Vite + Sveltekit). Perhaps fixed by this hot-off-the-press PR https://github.com/vitejs/vite/pull/5593? Or maybe it's this bug https://github.com/vitejs/vite/issues/4340? Bit beyond my pay grade

Bandit avatar Nov 09 '21 08:11 Bandit

We encountered the issue in Vite during alpha testing. See #1340 (also https://github.com/vitejs/vite/issues/3953). It's a bug in their module resolver. We cannot do much about that on our end, but it sounds like the PR you've linked above is expected to fix it.

Other platforms with known issues include Jest and ESLint (see #1481)

hiranya911 avatar Nov 09 '21 08:11 hiranya911

Can confirm this is an issue when creating a graphql express application. Version is 10.0.0

import { initializeApp } from "firebase-admin/app"
import { getAuth } from "firebase-admin/lib/auth"

const firebaseApp = initializeApp()
const auth = getAuth(firebaseApp)
> nodemon ./src/index.ts

[nodemon] 2.0.15
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): src\**\*.ts
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node ./src/index.ts`
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/auth' is not defined by "exports" in E:\TrailTrek\trail-trek-back\node_modules\firebase-admin\package.json
    at new NodeError (node:internal/errors:363:5)
    at throwExportsNotFound (node:internal/modules/esm/resolve:335:9)
    at packageExportsResolve (node:internal/modules/esm/resolve:560:3)
    at resolveExports (node:internal/modules/cjs/loader:476:36)
    at Function.Module._findPath (node:internal/modules/cjs/loader:516:31)
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:913:27)
    at Function.Module._resolveFilename.sharedData.moduleResolveFilenameHook.installedValue [as _resolveFilename] (C:\ProgramData\nvm\v16.4.0\node_modules\ts-node\node_modules\@cspotcode\source-map-support\source-map-support.js:679:30)
    at Function.Module._load (node:internal/modules/cjs/loader:772:27)
    at Module.require (node:internal/modules/cjs/loader:999:19)
    at require (node:internal/modules/cjs/helpers:93:18) {
  code: 'ERR_PACKAGE_PATH_NOT_EXPORTED'

BigBallard avatar Nov 13 '21 00:11 BigBallard

@DallasP9124 your import is wrong:

import { getAuth } from "firebase-admin/lib/auth"

Should be corrected as:

import { getAuth } from "firebase-admin/auth"

hiranya911 avatar Nov 13 '21 03:11 hiranya911

Can confirm this issue occurs, as of today, on

node --version
v14.18.0

Repro is just following the firebase setup docs, albeit with typescript imports. https://firebase.google.com/docs/admin/setup

Update: Visual Studio code is able to see the firebase-admin/app module though. Its just that when I run a test case with jest with minimal setup of FCM admin, the error occurs.

Looks like my issue is more related to: https://github.com/firebase/firebase-admin-node/issues/1481

For now, the workaround is good.

adgang avatar Nov 17 '21 05:11 adgang

@hiranya911 that did fix it. I was using WebStorm and it resolved the import to the wrong location.

BigBallard avatar Nov 17 '21 06:11 BigBallard

I got fixed by updating fireabse-admin and node version as below. firebase-admin: 10.0.0 node: v14.15.4

davidpirates avatar Nov 23 '21 09:11 davidpirates

any updates on this issue ? I am not able to use modular imports on Node 16 Cannot find module 'firebase-admin/auth' My installed version is 10.0.0

itssumitrai avatar Dec 09 '21 04:12 itssumitrai

I started getting this after installing the eslint-plugin-node module and enabling the plugin. The rule node/no-missing-import was causing the error. I fixed it by adding allowModules: ["firebase-admin"] in the rule config, like this:

"node/no-missing-import": [
  "error",
    {
      allowModules: ["firebase-admin"],
    },
  ],

TheSecurityDev avatar Dec 11 '21 03:12 TheSecurityDev

@TheSecurityDev Yes, ESLint is another known case. See my earlier comment https://github.com/firebase/firebase-admin-node/issues/1488#issuecomment-963929557

Open bug report in ESLint project: https://github.com/import-js/eslint-plugin-import/issues/1868

hiranya911 avatar Dec 12 '21 21:12 hiranya911

Same problem here. The suggested method in the documentation did not work.

However this solved it:

import * as admin from 'firebase-admin';

admin.initializeApp();

const db = admin.firestore();
const bucket = admin.storage().bucket();
const auth = admin.auth();

pooyasa avatar Dec 15 '21 09:12 pooyasa

same problem

node: v16.13.0

"typescript": "^4.5.4"
"firebase-admin": "^10.0.1",
"ts-node": "^10.4.0",
"ts-node-dev": "2.0.0-0",

eslint

{
    'import/no-unresolved': [
      'error',
      {
        ignore: ['^firebase-admin/.+'],
      },
    ],
    'node/no-missing-import': [
      'error',
      {
        allowModules: ['firebase-admin'],
      },
    ],
}

working only importing type

import type { MulticastMessage } from 'firebase-admin/messaging'

thx @pooyasa I also had to go back

reslear avatar Dec 16 '21 15:12 reslear

A co-worker had a similar issue, so just chiming in in case it helps someone. Basically, make sure you're running tooling that supports package.json exports field.

firebase-admin/app isn't a real file on disk, it's mapped as per:

https://github.com/firebase/firebase-admin-node/blob/7b15b27f2cfe05200fae1f907f9048788ac42e4c/package.json#L108-L111

In our case we were seeing discrepancies between developers' machines. Ensuring everyone was running Node 12.7 or greater resolved the issue.

Benjamin-Dobell avatar Dec 28 '21 22:12 Benjamin-Dobell

Had the same error in v9.5, works fine in v10 if I dont use firebase-functions and strictly use the submodules (firebase-functions/app, /auth, etc)

codingedgar avatar Jan 05 '22 15:01 codingedgar

I started to use firebase-admin@^10.0.1 and I had this error when running jest tests. It couldn't map "firebase-admin/app" to "firebase-admin/lib/app" as expected. So I have mapped this manually on jest.config.ts:

import { pathsToModuleNameMapper } from 'ts-jest/utils';
import { compilerOptions } from './tsconfig.json';

...
export default {
 ...
 moduleNameMapper: pathsToModuleNameMapper(
    {
      ...compilerOptions.paths,
      'firebase-admin/*': ['node_modules/firebase-admin/lib/*'],
    },
    {
      prefix: '<rootDir>',
    },
  ),
...
}

That worked for me.

And just to note, my tsconfig.json is like this:

{
  "compilerOptions": {
    ...
    "baseUrl": ".",
    "paths": {
      "modules/*": [
        "src/modules/*"
      ],
      "shared/*": [
        "src/shared/*"
      ],
    }
  }
}

HelderSi avatar Jan 09 '22 12:01 HelderSi

Hi, See that : https://firebase.google.com/docs/admin/migrate-node-v10#es-modules-support

alxcholley avatar Jan 24 '22 15:01 alxcholley

Similarly to @HelderSi, I had to do a moduleNameMapper config, but I'm using yarn v2 PnP, so my config looks like this:

import { pathsToModuleNameMapper } from "ts-jest/utils";

export default {
  preset: "ts-jest",
  testEnvironment: "node",
  modulePaths: ["<rootDir>/src"],
  moduleNameMapper: pathsToModuleNameMapper({
    "firebase-admin/*": ["firebase-admin/lib/*"],
  }),
};

fflores97 avatar Jan 26 '22 20:01 fflores97

For some reason npm pulled v9 for me, I manually edited my package.json (remember it's the one in the functions folder): "firebase-admin": "^10.0.2", All imports are working correctly now.

Enragedsaturday avatar Feb 02 '22 01:02 Enragedsaturday