Je sais qu'il y a des articles similaires à ce sujet, mais je les ai tous essayés et je n'ai pas travaillé. J'ai écrit cette fonction pour obtenir le nom de l'utilisateur à partir de l'UID. J'ai une collection appelée users, avec l'uid de chaque utilisateur comme nom du document, et une valeur appelée displayName dedans.

exports.getDisplayName = functions.https.onCall((data, context) => {
    if(context.auth){
        const uid = data.uid
        return admin.database().ref(`/users/${uid}`).get().then(doc=>{return{name: doc.data().displayName}})
    }else{
        throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.');
    }
})

Quand il le déploie, tout fonctionne bien, mais quand je l'appelle, j'obtiens ces 2 erreurs et je ne sais pas comment le résoudre.

Failed to load resource: the server responded with a status of 500 ()
Unhandled Promise Rejection: Error: INTERNAL

J'ai une autre fonction qui fonctionne bien:

exports.getUidFromEmail = functions.https.onCall((data, context) => {
    if(context.auth){
        const email = data.email
        return admin.auth().getUserByEmail(email).then((userRecord)=>{ return {user: userRecord.uid}})
    }else{
        throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.');
    }
})

Edit: l'erreur qu'il dit est la suivante:

Unhandled error FirebaseError: Can't determine Firebase Database URL.
at FirebaseDatabaseError.FirebaseError [as constructor]   (/workspace/node_modules/firebase-admin/lib/utils/error.js:44:28)
at new FirebaseDatabaseError (/workspace/node_modules/firebase-admin/lib/utils/error.js:205:23)
at DatabaseService.ensureUrl (/workspace/node_modules/firebase-admin/lib/database/database-internal.js:97:15)
at DatabaseService.getDatabase (/workspace/node_modules/firebase-admin/lib/database/database-internal.js:65:26)
at FirebaseApp.database (/workspace/node_modules/firebase-admin/lib/firebase-app.js:228:24)
at FirebaseNamespace.fn (/workspace/node_modules/firebase-admin/lib/firebase-namespace.js:191:45)
at /workspace/index.js:17:22
at func (/workspace/node_modules/firebase-functions/lib/providers/https.js:273:32)
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
    errorInfo: {
        code: 'database/invalid-argument',
        message: "Can't determine Firebase Database URL."
    }
} 
0
Tony Zhang 1 mars 2021 à 00:14

1 réponse

Meilleure réponse

J'ai résolu mon problème. C'était parce que j'utilisais Cloud Firestore au lieu de la base de données Realtime, parce que beaucoup d'exemples et de documents l'utilisent, je pensais qu'il avait juste une syntaxe différente 🤦🏻 voici le code corrigé:

exports.getDisplayName = functions.https.onCall((data, context) => {
    if(context.auth){
        const uid = data.uid

        return admin.firestore().collection("users").doc(uid).get().then(doc=>{
            console.log(doc)
            return{name: doc.data().displayName}
        })

    }else{
        throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.');
    }
})

Ce n'est admin.firestore() pas admin.database()

1
Tony Zhang 8 mars 2021 à 19:53