web-dev-qa-db-fra.com

Erreur Google Firebase (la fonction a renvoyé une promesse ou une valeur non définie ou attendue)

Je développe Server avec Firebase.

J'avais copié la vidéo du développeur Google sur Youtube .

Cela fonctionne bien, mais il y a une erreur sur le journal:

Fonction renvoyée promesse ou valeur non définie, attendue

Il est dit fonction retournée undefined, mais je fais function retourner un promise `set``

Comment puis-je résoudre ça?

function sanitize(s) {
    var sanitizedText = s;
    console.log('sanitize params: ', sanitizedText);
    sanitizedText = sanitizedText.replace(/\bstupid\b/ig, "wonderful");
    return sanitizedText;
}
exports.sanitizePost = functions.database
    .ref('/posts/{pushId}')
    .onWrite(event => {
        const post = event.data.val();
        if (post.sanitized) return;

        console.log('Sanitizing new post', event.params.pushId);
        console.log(post);
        post.sanitized = true;
        post.title = sanitize(post.title);
        post.body = sanitize(post.body);
        return event.data.ref.set(post); 
    })

Je suis débutant chez Firebase, Nodejs.

41
Hyuck-Jun Lee

Comme Frank l'indique dans son commentaire sur votre message, la déclaration qui produit l'avertissement est la suivante:

if (post.sanitized) return;

L’avertissement peut être désactivé en renvoyant une valeur factice (par exemple, null, false, 0). La valeur n'est pas utilisée.

Les versions précédentes de Cloud Functions ne se plaignaient pas lorsqu'une fonction était abandonnée à l'aide d'une instruction return sans valeur. Cela explique pourquoi vous voyez return; Dans la vidéo que vous avez liée et dans la documentation . Le commentaire sur la question de Firebaser Frank van Pufeelen explique pourquoi le changement a été effectué.

Le moyen le plus simple d’éliminer l’avertissement est d’ajouter une valeur de retour, comme l’a suggéré Frank:

if (post.sanitized) return 0;

Une autre option consiste à changer le déclencheur de onWrite() à onCreate(). Ensuite, la fonction ne sera pas appelée lorsque la publication est vérifiée et que le contrôle qui produit l'avertissement n'est pas nécessaire:

exports.sanitizePost = functions.database
    .ref('/test/{pushId}')
    .onCreate(event => {  // <= changed from onWrite()
        const post = event.data.val();
        //if (post.sanitized) return; // <= no longer needed

        console.log('Sanitizing new post', event.params.pushId);
        console.log(post);
        //post.sanitized = true; // <= not needed when trigger is onCreate()
        post.title = sanitize(post.title);
        post.body = sanitize(post.body);
        return event.data.ref.set(post);
    });
44
Bob Snyder

Je recevais cette même erreur pour avoir tenté de lire un document en utilisant .get() qui renvoie une promesse.

J'ai découvert dans le tutoriel officiel de Firebase YouTube que pour résoudre cette erreur, il me fallait renvoyer la promesse de code. Vérifiez minute 4:18 dans la vidéo liée au tutoriel [ https://youtu.be/d9GrysWH1Lc]

De plus, en guise de remarque, ce qui me conduit à la solution de tutoriel, c’est que j’ai remarqué que les journaux de fonction enregistraient effectivement les valeurs valides, mais seulement après la fermeture de la fonction, même si l’erreur indiquait que le résultat était indéfini.

0
Samer s Salib

En ajoutant à ce que @ bob-snyder a dit, votre problème est que votre retour undefined sous une condition.

if (post.sanitized) return;

Ma suggestion est d'utiliser un point de sortie unique , qui est une astuce courante lors de la programmation. Article .

Exemple

// code...
const SUCCESS_CODE = 0;

exports.sanitizePost = functions.database
    .ref('/posts/{pushId}')
    .onWrite(event => {
        const post = event.data.val();

        let response = Promise.resolve(SUCCESS_CODE);

        if (!post.sanitized) {
            console.log('Sanitizing new post', event.params.pushId);
            console.log(post);
            post.sanitized = true;
            post.title = sanitize(post.title);
            post.body = sanitize(post.body);
            response = event.data.ref.set(post); 
        }

        return response;
    })
0
ajorquera