[英]When fetching data in a firebase cloud function from firestore we get is not assignable errors when using a converter
我正在編寫一個雲 function,它需要使用 get() 從 firestore 檢索文檔。 然后我需要使用這些數據,所以我嘗試使用一個轉換器,以便稍后可以使用 object。 轉換器使用 FamilyRequest 來指定字段。 這是相關代碼:
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import * as firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
admin.initializeApp();
const db = admin.firestore();
const settings = {timestampsInSnapshots: true};
db.settings(settings);
class FamilyRequest {
recipient;
sender;
familyId;
role;
senderIsModGuard;
constructor (recipient: string, sender: string, familyId: string, role: string, senderIsModGuard: boolean) {
this.recipient = recipient;
this.sender = sender;
this.familyId = familyId;
this.role = role;
this.senderIsModGuard = senderIsModGuard;
}
toString() {
return this.recipient + ', ' + this.sender + ', ' + this.familyId + ', ' + this.role + ', ' + this.senderIsModGuard;
}
}
const familyRequestConverter = {
toFirestore(famrequest: FamilyRequest): firebase.firestore.DocumentData {
return {
recipient: famrequest.recipient,
sender: famrequest.sender,
familyId: famrequest.familyId,
role: famrequest.role,
senderIsModGuard: famrequest.senderIsModGuard
};
},
fromFirestore(
snapshot: firebase.firestore.QueryDocumentSnapshot,
options: firebase.firestore.SnapshotOptions
): FamilyRequest {
const data = snapshot.data(options)!;
return new FamilyRequest(data.recipient, data.sender, data.familyId, data.role, data.senderIsModGuard);
}
};
export const acceptFamilyRequestFromFamilyModerator = functions.https.onCall(
async (data, context) => {
// Message text passed from the client.
if (data && context && context.auth && context.auth.uid) {
const groupId = data.text.groupId;
// Authentication info is automatically added to the request.
const uid = context.auth.uid;
const requid = data.text.uid;
const famrequestrecipient = data.text.famrequestrecipient;
const famrequestsender = data.text.famrequestsender; //this is the original sender of the famrequest
//Do sender/recipient checks here
const ref = await db.collection("famrequests")
.doc(uid)
.collection('myfamrequests')
.doc(famrequestrecipient)
.withConverter(familyRequestConverter)
.get()
.then(doc => { //This is simplified for now
if (doc.exists) {
return doc;
} else {
return null;
}
});
}
});
將此代碼輸入 IDE 時,出現以下錯誤:
沒有過載匹配此調用。 重載 1 of 2,'(converter: null): DocumentReference',出現以下錯誤。 '{ toFirestore(famrequest: FamilyRequest): DocumentData; 類型的參數 fromFirestore(快照:QueryDocumentSnapshot,選項:SnapshotOptions):FamilyRequest; }' 不可分配給 'null' 類型的參數。 重載 2 of 2,'(converter: FirestoreDataConverter): DocumentReference',出現以下錯誤。 '{ toFirestore(famrequest: FamilyRequest): DocumentData; 類型的參數 fromFirestore(快照:QueryDocumentSnapshot,選項:SnapshotOptions):FamilyRequest; }' 不可分配給 'FirestoreDataConverter' 類型的參數。 “fromFirestore”的屬性類型不兼容。 類型'(快照:QueryDocumentSnapshot,選項:SnapshotOptions)=> FamilyRequest'不可分配給類型'(快照:QueryDocumentSnapshot)=> FamilyRequest'.ts(2769)const familyRequestConverter:{toFirestore(famrequest:FamilyRequest):firebase.firestore。文檔數據; fromFirestore(快照:firebase.firestore.QueryDocumentSnapshot,選項:firebase.firestore.SnapshotOptions):FamilyRequest; }
我不完全確定我做錯了什么,因為我在這里遵循轉換器的示例代碼: https://firebase.google.com/docs/firestore/query-data/get-data#web-version-8_3非常接近.
任何幫助深表感謝。
我對 familyRequestConverter 進行了以下更改:
const familyRequestConverter = {
toFirestore: function(famrequest: FamilyRequest): firebase.firestore.DocumentData {
return {
recipient: famrequest.recipient,
sender: famrequest.sender,
familyId: famrequest.familyId,
role: famrequest.role,
senderIsModGuard: famrequest.senderIsModGuard,
};
},
fromFirestore: function(
snapshot: firebase.firestore.DocumentData
) {
const data = snapshot.data()!;
return new FamilyRequest(data.recipient, data.sender, data.familyId, data.role, data.senderIsModGuard);
}
};
如果您在傳遞給withConverter
function 的轉換器 object 中缺少toFirestore
或fromFirestore
函數,則可能會導致此重載錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.