Angularfire 2 equalTo 查询不适用于从本机 phone 联系人获得的变量值

Angularfire 2 equalTo query not working with variable value obtained from native phone contacts

我正在使用以下内容:Ionic 3、Angularfire 2、usb 连接 iphone 和 Safari 开发者控制台,用于本机 cordova 测试(完整上下文)。

目标是 运行 通过从 phone 联系人中检索到的号码,看看它们是否存在于任何 Firebase /users/~user id string~/ ..然后再做如果他们这样做了。

简要的问题概述是我的方法是为每个数字返回空数组,就好像 Angularfire equalTo 查询没有从输入它的变量中传递一个值一样。

Firebase 结构

- users
    - <user id string>
        - name:   "Some name"
        - number: "1234 56789"

导出的JSON示例(不是真实姓名或数字):

"users" : {

    "21JvDyuzNcbKTxGhCEyEzzSbwKc2" : {
      "name" : "Gary Oose",
      "number" : "1234 56789"
    },
    "F1AvstJCWqdzBWarXtxwcm01Ir02" : {
      "name" : "Tina Urtle",
      "number" : "987 654321"
    },
    "KNTJdnKaE3amJ79LOq40ztKWBWp2" : {
      "name" : "Tommy Adpole",
      "number" : "121 212 121"
    }

}

代码如下..

contacts.find(["name", "phoneNumbers"], {multiple: true, hasPhoneNumber: true}).then(contacts => {

    contacts.forEach((contact, index) => {

        if (contacts[index].phoneNumbers !== null) {

            var number_to_check = contacts[index].phoneNumbers[0].value;

            //var number_to_check = contacts[index].phoneNumbers[0].value;toString();
            //var number_to_check = "1234 56789";

            console.log("contact_obj number = ", number_to_check);                  

            let db_users_list = this.afDB.list(`/users/`,

                {
                    query: {
                        orderByChild: 'number',
                        equalTo: number_to_check
                    }
                }

            ).subscribe(number_matches => {

                console.log('number_matches ', number_matches);

                db_users_list.unsubscribe();

            });

        }

    });

}); 

运行以上代码

当使用以下任一行时:

var number_to_check = contacts[index].phoneNumbers[0].value;

var number_to_check = contacts[index].phoneNumbers[0].value.toString();

(后者因为我不确定控制台输出是否对我撒谎,它正在返回一个字符串)

..代码中的第一个 console.log 确认已从本机 phone 联系人返回一个号码,例如:

[Log] contact_obj number = - "1234 56789‬"

.. 但第二个 console.log returns 是一个空数组,就好像查询中没有任何内容与 Firebase 数据库匹配(.. 它 returns 每个日志都相同循环返回的数字):

[Log] number_matches  – [] (0)

完整性检查方法(..咖啡 运行 出来了,我可能要疯了)

当我不使用上面两行中的任何一行时,我使用以下行:

var number_to_check = "1234 56789";

(手动输入变量的静态字符串值)

第一个 console.log returns 相同的数字一遍又一遍,如预期的那样看到静态字符串值已分配给 number_to_check 变量。

而第二个 console.log 正确 returns 该数字的数组,表明查询已在 Firebase 数据库中找到匹配项,如下所示:

[Log] number_matches
Array (1)
0 {name: "Gary Oose", number: "1234 56789", $key: "21JvDyuzNcbKTxGhCEyEzzSbwKc2"}

那么,对于第一种方法(使用下面的代码行)为什么不起作用,有人有任何指示吗?

var number_to_check = contacts[index].phoneNumbers[0].value;

我觉得我遗漏了一些非常明显的东西。为什么 AngularFire equalTo 查询不会获取那个变化的变量?

问题是以下行 returns 的字符串值中有时会出现白色 space(通过访问本机 phone 的联系电话):

contacts[index].phoneNumbers[0].value;

解决办法就是去掉白色space,像这样:

contacts[index].phoneNumbers[0].value.replace(/\s/g, '');

Replace method found in a comment in Remove whitespaces inside a string in javascript

我想白色 space 出现在一些但不是所有号码中必须归结为 phone 在以不同方式添加时如何存储联系号码.. 即通过共享联系人、手动输入等)。

有了这个解决方案,我可以成功找到 phone 数字匹配(我还更新了我的 Firebase 数字字符串,以便在没有 space 的情况下存储)。如下..

"users" : {

    "21JvDyuzNcbKTxGhCEyEzzSbwKc2" : {
      "name" : "Gary Oose",
      "number" : "123456789"
    },
    "F1AvstJCWqdzBWarXtxwcm01Ir02" : {
      "name" : "Tina Urtle",
      "number" : "987654321"
    },
    "KNTJdnKaE3amJ79LOq40ztKWBWp2" : {
      "name" : "Tommy Adpole",
      "number" : "121212121"
    }

}

如果我想在数字字符串中保留 spaces,我可以在 replace() 中添加一个 space 来解决这个问题.. replace(/\s/g, ' ')