我正在使用Firebase开发服务器。
我在Youtube上复制了Google Developer's Video。
效果很好,但在日志中出现错误:
函数返回未定义,预期的Promise或value
它说函数返回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的初学者。
答案 0 :(得分:42)
正如弗兰克在对你的帖子的评论中指出的那样,产生警告的返回声明是这样的:
if (post.sanitized) return;
通过返回虚拟值(例如null,false,0)可以使警告静音。该值未使用。
当使用没有值的return语句退出函数时,早期版本的Cloud Functions没有抱怨。这就解释了为什么您在关联的视频和the documentation中看到了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);
});
答案 1 :(得分:0)
由于尝试使用.get()
读取文档(返回一个承诺)而遇到同样的错误。
我在official Firebase YouTube tutorial中发现,要解决此错误,我需要返回诺言代码行。在教程链接的视频[https://youtu.be/d9GrysWH1Lc]
中检查分钟4:18此外,作为旁注,使我想到本教程解决方案的是,当我在函数日志中注意到确实记录了有效值时,但仅在函数关闭后才记录有效值,即使错误表明结果未定义。>
答案 2 :(得分:0)
除了@ bob-snyder所说的那样,您的问题是您返回undefined
是在一定条件下。
if (post.sanitized) return;
我的建议是使用单个出口点,这是编程时的常见提示。 Article。
// 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;
})