18

Pracuję nad serwerem z Firebase.Google Firebase Error (funkcja zwróciła niezdefiniowaną, oczekiwaną obietnicę lub wartość)

Skopiowałem wideo programisty Google na numer Youtube.

To działa dobrze, ale w dzienniku jest błąd:

Function returned undefined, expected Promise or value

Mówi funkcja powrócił undefined, ale robię function zwrócić promise `set``

Jak mogę rozwiązać ten problem?

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); 
    }) 

Jestem początkujący w Firebase, Nodejs.

+0

Spróbuj 'if (post.sanitized) return true;' –

+0

@FrankvanPuffelen: Ten post był coraz dużo widoków. W komentarzu od AaronJo w mojej odpowiedzi poniżej, dzieli się tym, że wsparcie dla Firebase wskazało zmianę wymagającą obietnicy lub wartość wskaźnika skalarnego była zamierzona i pozostanie. Czy możesz podzielić się spostrzeżeniami na temat przyczyn wprowadzenia zmiany? Jakie są korzyści? Kiedy zwracana jest wartość nie-Obietnicza, czy wartość ma jakieś znaczenie? –

+6

Po jawnym zwróceniu wartości jasne jest, że funkcja jest wykonana. Kiedy wyraźnie zwrócisz obietnicę, jest oczywiste, że funkcja musi pozostać aktywna, dopóki obietnica nie zostanie rozwiązana/odrzucona. Jeśli nie zwrócisz wartości, nie jest jasne, w jakim stanie jest ta funkcja. –

Odpowiedz

16

Frank wskazuje w swoim komentarzu do Twojego wpisu, instrukcja return, która produkuje ostrzeżenia jest to jedno:

if (post.sanitized) return; 

Ostrzeżenie może być wyciszony poprzez zwrot wartości obojętne (np null, false 0). Wartość nie jest używana.

Wcześniejsze wersje funkcji chmurowych nie narzekały, gdy funkcja została zakończona za pomocą instrukcji return bez wartości. To wyjaśnia, dlaczego widzisz return; w wideo, który podłączyłeś, oraz w the documentation. Komentarz do pytania autorstwa Firebasera Franka van Pufeelena wyjaśnia, dlaczego wprowadzono tę zmianę.

Najprostszym sposobem, aby wyeliminować ostrzeżenie jest dodanie wartości zwracanej, jak sugeruje Frank:

if (post.sanitized) return 0; 

Innym rozwiązaniem jest zmiana spust z onWrite() do onCreate(). Następnie funkcja nie zostanie wywołana, gdy post jest odkażane i sprawdzenie, która produkuje ostrzeżenie nie jest potrzebna:

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); 
    }); 
+0

Czy ta kontrola zostanie usunięta w najbliższym czasie? W przeciwnym razie musielibyśmy zmienić wiele kodu, aby uciszyć te ostrzeżenia o błędach w dziennikach. –

+0

@AaronJo: Skontaktuj się z pomocą techniczną Firebase: https://firebase.google.com/support/contact/bugs-features/ –

+0

Z tego, co mi powiedziano w bazie wsparcia Firebase, brzmi, jakby rzeczy pozostały w ten sposób. –