【问题标题】:Why using the same code, Firestore not workin in NodeJS but work in browser?为什么使用相同的代码,Firestore 不能在 Node JS 中工作但在浏览器中工作?
【发布时间】:2020-10-01 13:21:08
【问题描述】:

相同的源代码工作在一个单独的 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);
    }
  );

以上,我从谷歌教程中获取的示例并且工作正常。但是,进入服务器端,使用依赖:

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 页面示例继续工作。

【问题讨论】:

    标签: javascript node.js google-cloud-firestore


    【解决方案1】:

    我发现了错误,由于多种原因导致了此消息,在这种情况下,我在任何地方都找不到文档,即使在 stackoverflow 中也是如此。

    当您使用错误的凭据进行验证时会出现错误的原因,但对于另一个项目有效。在我的情况下,我使用 docker 容器,所以我使用这样的环境变量设置凭证:

    ENV GOOGLE_APPLICATION_CREDENTIALS wrong-project.json
    

    我生成了正确的 json 凭证并且运行良好。

    Into html 以前可以工作,因为 html 不需要凭据即可工作。但是在 nodeJS 中,google firestore sdk 需要凭据。

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 2011-06-05
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多