#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 требует учетных данных.