Почему, используя тот же код, Firestore не работает в NodeJS, но работает в браузере?

#javascript #node.js #google-cloud-firestore

#javascript #node.js #google-облако-firestore

Вопрос:

Тот же исходный код работает в отдельной HTML-странице:

 <script src="https://www.gstatic.com/firebasejs/7.19.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.19.0/firebase-firestore.js"></script>
<script>

  var firebaseConfig = {
    apiKey: "XYZ",
    authDomain: "XYZ.firebaseapp.com",
    databaseURL: "https://XYZ.firebaseio.com",
    projectId: "XYZ",
    storageBucket: "XYZ.appspot.com",
    messagingSenderId: "XYZ",
    appId: "XYZ"
  };
  // Initialize Firebase
  let db =null;
  if(!firebase.apps.length){
    firebase.initializeApp(firebaseConfig);
    db = firebase.firestore();
  }

  const id = new Date().getTime();
  const userid = new Date().getTime();
  let docRef = db.collection("alarms").doc("teste" id);

  docRef.set({ userid: userid  }, { merge: true }).then((id)=>{
    console.log("ID:",id);
  }).catch(
    (err)=>{
      console.error(err);
    }
  );
  

Приведенный выше пример, который я взял из руководства Google, работает нормально. Но на стороне сервера, используя зависимости:

package.json

  {
  "name": "appengine-typescript",
  "description": "An example TypeScript app running on Google App Engine.",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": ">=8.0.0"
  },
  "scripts": {
    "start": "node -r source-map-support/register index.js"
  },
  "dependencies": {
    "async_hooks": "^1.0.0",
    "axios": "^0.19.2",
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "ejs": "^2.6.2",
    "express": "^4.16.3",
    "firebase-admin": "8.6.0",
    "firebase-functions": "3.3.0",
    "jest-cli": "^26.4.2",
    "js-sha1": "^0.6.0",
    "node-cache": "^4.2.1",
    "node-rest-client": "^3.1.0",
    "nodemailer": "^6.3.0",
    "source-map-support": "^0.5.16",
    "uuid": "^3.3.2"
  },
  "devDependencies": {
  },      
}
  

Источник:

 import * as functions from "firebase-functions";
import * as firebase from "firebase-admin";

 if (!firebase.apps.length) {
    var firebaseConfig = {
        apiKey: "XYZ",
        authDomain: "XYZ.firebaseapp.com",
        databaseURL: "https://XYZ.firebaseio.com",
        projectId: "XYZ",
        storageBucket: "XYZ.appspot.com",
        messagingSenderId: "XYZ",
        appId: "XYZ"
      };
      // Initialize Firebase
      firebase.initializeApp(firebaseConfig); 
}

const db = firebase.firestore();

const cmpID = "cmpid:"   new Date().getTime();
const userid = "userid"   new Date().getTime();


let docRef = db.collection("alarms").doc(cmpID);

docRef.set({ userid  }, { merge: true }).then((id)=>{
    console.log("ID:",id);
  }).catch(
    (err)=>{
      console.error(err);
    }
  );
  

В этом случае возникает ошибка, приведенная ниже:

 { Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.
    at Object.callErrorFromStatus (/mnt/c/Users/gandb/Documents/workspace/vriend/v-alarm/services/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
    at Http2CallStream.call.on (/mnt/c/Users/gandb/Documents/workspace/vriend/v-alarm/services/node_modules/@grpc/grpc-js/build/src/client.js:96:33)
    at Http2CallStream.emit (events.js:203:15)
    at process.nextTick (/mnt/c/Users/gandb/Documents/workspace/vriend/v-alarm/services/node_modules/@grpc/grpc-js/build/src/call-stream.js:100:22)
    at process._tickCallback (internal/process/next_tick.js:61:11)
  code: 7,
  details: 'Missing or insufficient permissions.',
  metadata: Metadata { internalRepr: Map {}, options: {} } }
  

Моя конфигурация Firestore:

 service cloud.firestore {
    match /databases/{database}/documents {
    match /{document=**} {
      allow  create,read, write, update, delete: if true;
    }
    }
}
  

Кроме того, я пытался :

  • Измените разрешение проекта папки и вложенных папок на 777
  • Использование анонимной вкладки и пример html-страницы продолжают работать.

Ответ №1:

Я обнаружил ошибку, исправляющую это сообщение по многим причинам, в данном случае я нигде не нашел документацию, даже здесь, в stackoverflow.

Причина, которая возникает, когда вы аутентифицируетесь, используя неправильные учетные данные, действительные, но для другого проекта. В моем случае я использую контейнер docker, поэтому я настраиваю учетные данные, используя переменную enviroment следующим образом:

 ENV GOOGLE_APPLICATION_CREDENTIALS wrong-project.json
  

Я генерирую правильные учетные данные json и работает хорошо.

В html работает раньше, потому что html не требует учетных данных для работы. Но для NodeJS, google firestore sdk требует учетных данных.