web-dev-qa-db-ja.com

Google Firebase Error(関数は未定義の、期待される約束または値を返しました)

FirebaseでServerを開発しています。

Youtube でGoogle Developer's Videoをコピーしました。

それはうまく機能しますが、ログにはエラーがあります:

関数が未定義の期待されるPromiseまたは値を返しました

関数はundefinedを返しましたが、functionpromise `set``を返します

どうすれば解決できますか?

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

私は、Firebase、Nodejsの初心者です。

41
Hyuck-Jun Lee

フランクがあなたの投稿に対するコメントで指摘しているように、警告を発しているreturnステートメントは次のとおりです。

if (post.sanitized) return;

ダミー値(null、false、0など)を返すことにより、警告を止めることができます。値は使用されません。

Cloud Functionsの以前のバージョンは、値のないreturnステートメントを使用して関数が終了したときに文句を言いませんでした。リンクしたビデオと ドキュメントreturn;が表示される理由は、このためです。 Firebaser Frank van Pufeelenによる質問に対するコメントは、変更が行われた理由を説明しています。

警告を削除する最も簡単な方法は、Frankが提案したように戻り値を追加することです。

if (post.sanitized) return 0;

別のオプションは、トリガーをonWrite()からonCreate()に変更することです。その場合、投稿がサニタイズされるときに関数は呼び出されず、警告を生成するチェックは必要ありません。

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

Promiseを返す.get()を使用してドキュメントを読み込もうとすると、同じエラーが発生していました。

公式のFirebase YouTubeチュートリアル で、このエラーを解決するにはreturn the promiseのコード行が必要であることがわかりました。チュートリアルのリンクビデオ[ https://youtu.be/d9GrysWH1Lc]minute 4:18を確認してください。

また、副次的な注意点として、チュートリアルソリューションに私を導いたのは、エラーが結果が未定義であると言っていても、関数ログで実際に有効な値を記録したことに気づいたときです。

0
Samer s Salib

@ bob-snyderが言ったことに加えて、あなたの問題は、ある条件下でundefinedを返すことです。

if (post.sanitized) return;

私の提案は、単一の出口点を使用することです。これはプログラミングの際の一般的なヒントです。 記事

// 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