Google Firebase 错误(函数返回未定义、预期的 Promise 或值)

新手上路,请多包涵

我正在使用 Firebase 开发服务器。

我在 Youtube 上复制了 Google Developer 的视频。

它运行良好,但在日志中出现错误:

函数返回未定义、预期的 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 的初学者。

原文由 Josh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 384
2 个回答

正如弗兰克在他对您的帖子的评论中指出的那样,产生警告的返回语句是这样的:

 if (post.sanitized) return;

可以通过返回一个虚拟值(例如 null、false、0)来消除警告。该值未被使用。

当函数使用没有值的 return 语句退出时,早期版本的 Cloud Functions 不会报错。这就解释了为什么您在链接的视频和 文档 中看到 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);
    });

原文由 Bob Snyder 发布,翻译遵循 CC BY-SA 3.0 许可协议

添加到@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;
    })

原文由 ajorquera 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题