FirebaseでServerを開発しています。
Youtube でGoogle Developer's Videoをコピーしました。
それはうまく機能しますが、ログにはエラーがあります:
関数が未定義の期待されるPromiseまたは値を返しました
関数はundefined
を返しましたが、function
はpromise
`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の初心者です。
フランクがあなたの投稿に対するコメントで指摘しているように、警告を発している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);
});
Promiseを返す.get()
を使用してドキュメントを読み込もうとすると、同じエラーが発生していました。
公式のFirebase YouTubeチュートリアル で、このエラーを解決するにはreturn the promiseのコード行が必要であることがわかりました。チュートリアルのリンクビデオ[ https://youtu.be/d9GrysWH1Lc] でminute 4:18を確認してください。
また、副次的な注意点として、チュートリアルソリューションに私を導いたのは、エラーが結果が未定義であると言っていても、関数ログで実際に有効な値を記録したことに気づいたときです。
@ 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;
})