node.js - 在 Node js 上初始化 Firestore Admin SDK 时出现身份验证错误
问题描述
我正在尝试使用节点 js 构建一个服务器,该服务器处理来自客户端的数据并将其上传到 Firestore。我还是新人。这是我的服务器的代码:
const express = require('express');
const multer = require('multer');
const path = require('path');
const admin = require('firebase-admin');
let app = express();
let upload = multer();
let serviceAccount = require('./psylocke-774e2adbf0e5.json');
admin.initializeApp({
credentials: admin.credential.cert(serviceAccount)
});
let db = admin.firestore();
let port = process.env.PORT || 8000;
app.route('/interface').get((_, res) => {
try {
res.sendFile(__dirname + '/interface.html');
} catch (e) {
res.status(404).send(e.message);
}
})
app.post('/upload', upload.any(), (req, res) => {
let test = {
name:'juan',
age:15
};
db.collection('roots').doc('sampleroot').set(test).then((mess) => {
console.log("I went through hwere");
res.send('it worked');
}).catch((err) => {
res.send('it didnt work');
console.log(err);
});
})
app.listen(port, () => console.log(`Server running on port ${port}`));
这是我的项目 JSON 文件(我必须从谷歌云平台下载):
{
"type": "service_account",
"project_id": "psylocke",
"private_key_id": "<id>",
"private_key": "<private key>",
"client_email": "firebase-adminsdk-ja1c3@psylocke.iam.gserviceaccount.com",
"client_id": "113260833969613996508",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/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/firebase-adminsdk-ja1c3%40psylocke.iam.gserviceaccount.com"
}
我收到以下错误:
Error: Unable to detect a Project Id in the current environment.
To learn more about authentication and Google APIs, visit:
https://cloud.google.com/docs/authentication/getting-started
我收到这个错误很奇怪,因为项目 ID 实际上是在 json 文档中指定的。有谁知道发生了什么?
解决方案
这是因为 Firestore。在 initializeApp 上有一个选项可以传入您需要执行的 projectID。Firestore 与 IAM 的集成还不足以(还)从服务帐户中提取,特别是因为服务帐户可以(并且经常)指向其他项目,因此您可能不一定希望它这样做。
检查此文档:https ://firebase.google.com/docs/reference/node/firebase了解您可以传递给该初始化调用的选项。例如:
// Initialize default app
// Retrieve your own options values by adding a web app on
// https://console.firebase.google.com
firebase.initializeApp({
apiKey: "AIza....", // Auth / General Use
appId: "1:27992087142:web:ce....", // General Use
projectId: "my-firebase-project", // General Use
authDomain: "YOUR_APP.firebaseapp.com", // Auth with popup/redirect
databaseURL: "https://YOUR_APP.firebaseio.com", // Realtime Database
storageBucket: "YOUR_APP.appspot.com", // Storage
messagingSenderId: "123456789", // Cloud Messaging
measurementId: "G-12345" // Analytics
});