【问题标题】:Firebase Realtime Database - foreach - expected to receive a value at the end of arrow functionFirebase 实时数据库 - foreach - 预计将在箭头函数结束时收到一个值
【发布时间】:2019-08-29 00:07:18
【问题描述】:

一旦我调用 foreach 函数遍历每个孩子并更新匹配的记录,我就会收到警告“预计在箭头函数的末尾接收一个值”。

var email = req.body.email;
var name = req.body.name;
var result = false;
    userRef.once('value', snapshot => {
        result = snapshot.forEach(child => {
            if (child.val().email === email){
                console.log(child.key);

                admin.database().ref('users/'+child.key).update({name: name}).then(result =>{
                    res.status(200).json({message: 'Updated'});
                    return true;
                })
                .catch(err => {
                    console.log(err);
                    return false;
                });
                return true;
            }
        });
        if (result === false){
            res.status(200).json({message: 'User does not exist'});
        }
    });

我从 http post 参数 email 收到了,现在我使用“foreach”来搜索拥有此类电子邮件的用户。一旦我找到它,我用另一个参数“name”更新它的名字,然后我返回 true 以退出 foreach 循环。但是,我收到一条警告消息,说我错过了一个返回,这是在代码永远不会进入 if 语句的情况下。在正常情况下,我会获取数组的长度,一旦循环结束,我会返回 false,但在这里我不能。

我的数据库:

users
    -Lbq98URniAej2TkWBhG
           email: "pepe@san.com"
           name: "Pepe"
    -Lbq9GC1A131De-iumI0
           email: "pipa@boca.com"
           name: "Pipa10"

【问题讨论】:

标签: javascript firebase-realtime-database


【解决方案1】:

您没有从回调中的每个代码路径返回布尔值。例如,如果child.val().email === email 评估为假怎么办?回调返回什么?在您的代码中,它不会返回任何内容,因为没有执行任何 return 语句。这就是导致错误消息的原因。在这种情况下,您需要返回一些东西。也许这样的事情会起作用:

    result = snapshot.forEach(child => {
        if (child.val().email === email){
            console.log(child.key);

            admin.database().ref('users/'+child.key).update({name: name}).then(result =>{
                res.status(200).json({message: 'Updated'});
                return true;
            })
            .catch(err => {
                console.log(err);
                return false;
            });
            // this line doesn't help anything, commented out
            //return true;
        }
        return true;  // this line always returns true from forEach
    });

【讨论】:

  • 道格谢谢。但是,如果我没有更新任何东西,我怎么能返回 false 呢?我想让前台知道我们找不到输入的电子邮件。
  • // this line doesn't help anything, commented out it does - 它在满足条件时提前终止。使用您的建议,每一次迭代都会执行return true,所以您永远不会做超过一个循环,不是吗?
  • 如我所说,如果child.val().email === email 产生错误则不会。也许你可以两者兼得。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多