59 votes

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

Je suis le développement de Serveur avec Firebase.

J'avais copié Google Developer Vidéo sur Youtube.

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

Fonction renvoyée indéfini, attendu la Promesse ou de la valeur

Il dit que la fonction est retourné undefined, mais je m'en function retourner un promise "set`

Comment puis-je résoudre ce problème?

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 de Firebase, Nodejs.

61voto

Bob Snyder Points 24996

Comme Frank indique dans son commentaire sur votre message, l'instruction return qui est la production de l'avertissement est celui-ci:

if (post.sanitized) return;

L'avertissement peut être réduite au silence par renvoi d'une valeur factice (par exemple, null, false, 0). La valeur n'est pas utilisée.

Les versions antérieures de Cloud Fonctions ne se plaignent pas quand une fonction est sorti à l'aide d'une instruction de retour avec aucune valeur. Qui explique pourquoi vous voyez return; dans la vidéo vous a lié et dans la documentation. Le commentaire sur la question par Firebaser Frank van Pufeelen, explique pourquoi le changement a été fait.

La façon la plus simple pour éliminer l'avertissement est d'ajouter une valeur de retour, comme Frank a suggéré:

if (post.sanitized) return 0;

Une autre option est de changer la détente d' onWrite() de onCreate(). Ensuite, la fonction ne peut être invoquée lorsque le poste est aseptisé et la vérification que le produit de 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);
    });

2voto

Samer s Salib Points 789

J'ai été faire cette même erreur pour tentative de lecture d'un document à l'aide d' .get() qui renvoie une promesse.

J'ai trouvé dans l' officiel Firebase YouTube tutoriel que, pour résoudre cette erreur, j'avais besoin de retourner la promesse de ligne de code. Vérifier la minute 4:18 dans le tutoriel vidéo liée [https://youtu.be/d9GrysWH1Lc]

Aussi, comme une note de côté, ce qui me conduisent à l'tutoriel solution est quand j'ai remarqué dans la fonction billes ne se fait une session valide les valeurs, mais seulement après que la fonction est fermé, même si le message d'erreur indique que le résultat est indéfini.

2voto

ajorquera Points 47

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

 if (post.sanitized) return;
 

Ma suggestion est d'utiliser un seul point de sortie , ce qui est un conseil commun lors de la programmation. L'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;
    })
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X