15

First time deploying a GAE app here, I'm trying to follow this tutorial: https://firebase.googleblog.com/2016/08/sending-notifications-between-android.html (see node code section).

I ran

npm install firebase-admin --save
npm install request --save

on my machine, the package.json is here, but when I use gcloud app deploy, I get these logs when opening the app on my browser:

2017-02-10 09:35:02 default[20170210t103151]  module.js:471
2017-02-10 09:35:02 default[20170210t103151]      throw err;
2017-02-10 09:35:02 default[20170210t103151]      ^
2017-02-10 09:35:02 default[20170210t103151]
2017-02-10 09:35:02 default[20170210t103151]  Error: Cannot find module 'firebase-admin'
2017-02-10 09:35:02 default[20170210t103151]      at Function.Module._resolveFilename (module.js:469:15)
2017-02-10 09:35:02 default[20170210t103151]      at Function.Module._load (module.js:417:25)
2017-02-10 09:35:02 default[20170210t103151]      at Module.require (module.js:497:17)
2017-02-10 09:35:02 default[20170210t103151]      at require (internal/module.js:20:19)
2017-02-10 09:35:02 default[20170210t103151]      at Object.<anonymous> (/app/server.js:1:78)
2017-02-10 09:35:02 default[20170210t103151]      at Module._compile (module.js:570:32)
2017-02-10 09:35:02 default[20170210t103151]      at Object.Module._extensions..js (module.js:579:10)
2017-02-10 09:35:02 default[20170210t103151]      at Module.load (module.js:487:32)
2017-02-10 09:35:02 default[20170210t103151]      at tryModuleLoad (module.js:446:12)
2017-02-10 09:35:02 default[20170210t103151]      at Function.Module._load (module.js:438:3)
2017-02-10 09:35:07 default[20170210t103151]  module.js:471
2017-02-10 09:35:07 default[20170210t103151]      throw err;
2017-02-10 09:35:07 default[20170210t103151]      ^
2017-02-10 09:35:07 default[20170210t103151]
2017-02-10 09:35:07 default[20170210t103151]  Error: Cannot find module 'firebase-admin'
2017-02-10 09:35:07 default[20170210t103151]      at Function.Module._resolveFilename (module.js:469:15)
2017-02-10 09:35:07 default[20170210t103151]      at Function.Module._load (module.js:417:25)
2017-02-10 09:35:07 default[20170210t103151]      at Module.require (module.js:497:17)
2017-02-10 09:35:07 default[20170210t103151]      at require (internal/module.js:20:19)
2017-02-10 09:35:07 default[20170210t103151]      at Object.<anonymous> (/app/server.js:1:78)
2017-02-10 09:35:07 default[20170210t103151]      at Module._compile (module.js:570:32)
2017-02-10 09:35:07 default[20170210t103151]      at Object.Module._extensions..js (module.js:579:10)
2017-02-10 09:35:07 default[20170210t103151]      at Module.load (module.js:487:32)
2017-02-10 09:35:07 default[20170210t103151]      at tryModuleLoad (module.js:446:12)
2017-02-10 09:35:07 default[20170210t103151]      at Function.Module._load (module.js:438:3)
2017-02-10 09:43:58 default[20170210t104151]  module.js:471
2017-02-10 09:43:58 default[20170210t104151]      throw err;
2017-02-10 09:43:58 default[20170210t104151]      ^
2017-02-10 09:43:58 default[20170210t104151]
2017-02-10 09:43:58 default[20170210t104151]  Error: Cannot find module 'serviceAccountKey.json'
2017-02-10 09:43:58 default[20170210t104151]      at Function.Module._resolveFilename (module.js:469:15)
2017-02-10 09:43:58 default[20170210t104151]      at Function.Module._load (module.js:417:25)
2017-02-10 09:43:58 default[20170210t104151]      at Module.require (module.js:497:17)
2017-02-10 09:43:58 default[20170210t104151]      at require (internal/module.js:20:19)
2017-02-10 09:43:58 default[20170210t104151]      at Object.<anonymous> (/app/server.js:7:22)
2017-02-10 09:43:58 default[20170210t104151]      at Module._compile (module.js:570:32)
2017-02-10 09:43:58 default[20170210t104151]      at Object.Module._extensions..js (module.js:579:10)
2017-02-10 09:43:58 default[20170210t104151]      at Module.load (module.js:487:32)
2017-02-10 09:43:58 default[20170210t104151]      at tryModuleLoad (module.js:446:12)
2017-02-10 09:43:58 default[20170210t104151]      at Function.Module._load (module.js:438:3)
2017-02-10 09:44:10 default[20170210t104151]  module.js:471
2017-02-10 09:44:10 default[20170210t104151]      throw err;
2017-02-10 09:44:10 default[20170210t104151]      ^
2017-02-10 09:44:10 default[20170210t104151]
2017-02-10 09:44:10 default[20170210t104151]  Error: Cannot find module 'serviceAccountKey.json'
2017-02-10 09:44:10 default[20170210t104151]      at Function.Module._resolveFilename (module.js:469:15)
2017-02-10 09:44:10 default[20170210t104151]      at Function.Module._load (module.js:417:25)
2017-02-10 09:44:10 default[20170210t104151]      at Module.require (module.js:497:17)
2017-02-10 09:44:10 default[20170210t104151]      at require (internal/module.js:20:19)
2017-02-10 09:44:10 default[20170210t104151]      at Object.<anonymous> (/app/server.js:7:22)
2017-02-10 09:44:10 default[20170210t104151]      at Module._compile (module.js:570:32)
2017-02-10 09:44:10 default[20170210t104151]      at Object.Module._extensions..js (module.js:579:10)
2017-02-10 09:44:10 default[20170210t104151]      at Module.load (module.js:487:32)
2017-02-10 09:44:10 default[20170210t104151]      at tryModuleLoad (module.js:446:12)
2017-02-10 09:44:10 default[20170210t104151]      at Function.Module._load (module.js:438:3)
2017-02-10 16:20:02 default[20170210t124920]  Error: Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "connect ETIMEDOUT 74.125.202.84:443".
2017-02-10 16:20:02 default[20170210t124920]      at /app/node_modules/firebase-admin/lib/firebase-app.js:74:23
2017-02-10 16:20:02 default[20170210t124920]      at process._tickCallback (internal/process/next_tick.js:103:7)

How do I fix this ??

ypicard
  • 3,593
  • 3
  • 20
  • 34
  • Got a similar problem, also have the "Cannot find module 'serviceAccountKey.json'. I have a feeling this has to do with the firebase-admin module. – ffritz Feb 11 '17 at 16:34
  • 1
    Does the script work locally? Does it only fail when you deploy to GAE? – bojeil Feb 11 '17 at 17:06
  • I'm not sure how I'm supposed to test it locally... Not a node expert (yet), can you guide me on how to do so ? – ypicard Feb 11 '17 at 18:40
  • Anyone? I'd like to get this over with :) – ypicard Feb 12 '17 at 11:05
  • Are you sure your package.json and your service account key file are actually getting deployed to GAE? It looks like they are not. – jwngr Feb 13 '17 at 05:24
  • How do I check this? – ypicard Feb 13 '17 at 14:27
  • I have the same issue, did you solved this ? – Xero Feb 21 '17 at 17:24
  • Yeah, I switched to Heroku... Please tell me if you manage to get it working on GAE – ypicard Feb 22 '17 at 21:54
  • Your package.json and serviceAccountKey.json files are definitely being omitted from the deployment, possible due to existing outside of the directory where your app.yaml is located. Can post a listing of the root level of your app directory? To test locally by the way, you can just do 'node app.js' (or whatever you've named your app's main .js file). – Adam Feb 25 '17 at 21:12
  • @warhost: You need to give the full path JSON of the serviceAccountKey file, even you put the file in the same directory with the script. For me is: `var serviceAccount = require('/Users/silviu/Ionic Projects/CD_Backend/service_account.json');` instead of `var serviceAccount = require('service_account.json');` – Silviu Mar 03 '17 at 12:41
  • 1
    @jacobawenger, or someone who knows... I have the same problem described. Could you please specify how to deploy the serviceAccountKey.json file? My app runs locally, but when I deploy I get the the error describe in the question. – Marcelo Gumiero Mar 05 '17 at 21:23

3 Answers3

44

These issues seem to be caused by a misunderstanding of how require() paths work. You cannot use an absolute path because something like require("/Users/username/somepath") obviously won't exist on the remote machine when the app is deployed and the import will fail. Using require("serviceAccountKey.json") is going to look in node_modules/serviceAccountKey.json relative to the app directory.

If you want to load serviceAccountKey.json from the app's root directory, you would use require("./serviceAccountKey.json"). If it were in a subdirectory called foo under the root you'd use require("./foo/serviceAccountKey.json"). This also applies to loading modules in general such as firebase-admin.

The NodeJS Modules documentation explains the require() mechanism in greater detail.

Adam
  • 5,697
  • 1
  • 20
  • 52
4

I could make a workaround on this proceeding like this: (passing the serviceAccountkeyFile.json parameters inside app.js code):

let defaultAppConfig = {
    credential: admin.credential.cert({
        type: "service_account",
        project_id: "txxxxxxxxxx",
        private_key_id: "xxxxxxxxxxxxxxxxxxxxxxxxxx",
        private_key: "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
        client_email: "firebaxxxxxxx@xxxxxxx.gserviceaccount.com",
        client_id: "11111111111111111",
        auth_uri: "https://accounts.google.com/o/oauth2/auth",
        token_uri: "https://accounts.google.com/o/oauth2/token",
        auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
        client_x509_cert_url: "https://www.googleapis.com/robot/v1/metadata/x509/jjjjjj.gserviceaccount.com"
    }),
    databaseURL: 'https://projectxxx.firebaseio.com/'
}

defaultApp = admin.initializeApp(defaultAppConfig);
piet.t
  • 11,718
  • 21
  • 43
  • 52
Marcelo Gumiero
  • 1,849
  • 2
  • 14
  • 14
  • 1
    this way show me red underline with error Argument of type '{type:string}.... is not assignable to paramter of type – Manspof May 10 '18 at 11:18
  • @AdirZoari, where in code this red underline is appearing? I can imagine that you can verify your lint component (jslint, eslint, etc.). If they are not perfectly and correctly configured, sometimes we have these behavior you mentioned... – Marcelo Gumiero May 10 '18 at 18:12
  • you can see my issue I post here https://stackoverflow.com/questions/50272165/firebase-import-service-throws-error – Manspof May 10 '18 at 20:16
  • Are you using TypeScript? A typical message from it... If so, configure your lint properly. For instance, if you are using ESLINT, configure it properly. The example I wrote above if from a Node.js file that is working perfectly. – Marcelo Gumiero May 10 '18 at 21:56
  • It's recommended not to include secrets in your source code, in case it goes public on GitHub. – Carl Walsh Dec 30 '19 at 23:06
1

I had a similar problem running gcloud app deploy

Error: Cannot find module 'webpack-dev-server'
at Function.Module._resolveFilename (module.js:469:15)

I solved the issue moving the given dependency (wepack-dev-server) from devDependencies to dependencies in package.json.

In case somebody else has the same problem I suggest to have look at your dependencies in package.json. dependencies are required to run, devDependencies only to develop, e.g.: unit tests, Coffeescript to Javascript transpilation, minification,

Titogelo
  • 73
  • 7