从Firestore读取不会返回任何内容

时间:2019-12-27 10:46:13

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions

我正在尝试从函数读取/写入Firestore,并且读取有问题,写入工作正常。我正在按照here的示例进行操作,但是下面的查询(及其变体)返回了空的Promise:

module.exports.customerByPhone = phone => {
    return db.collection('customers')
    .limit(1)
    .get();
    // .where('phoneNumber', '==', phone).get();
};

如您所见,最初我尝试使用 where -空的承诺,我也尝试使用任何-相同的结果。

这是我插入数据的方式:

db.collection('customers').add({
        phoneNumber: 123456,
        active: true,
        registration: new Date()
    }).then(it => console.log(`added ${it}`));

Package.json片段:

"dependencies": {
    "firebase-admin": "^8.6.0",
    "firebase-functions": "^3.3.0"
  }

以及一些身份验证逻辑:

const key = require("../firebase.key.json");
//
admin.initializeApp({
    credential: admin.credential.cert(key),
    databaseURL: "https://cant-touch-this.firebaseio.com"
});
const db = admin.firestore();

编辑

这里的应用程序流程更完整

请求处理程序如下:

module.exports.handle = (req, res) => {
    // doInsert and query below are just for test purposes
    db.doInsert();
    db.customerByPhone(req.body.phoneNumber).then(function (doc) {
        if (doc.exists) {
            console.log("Document data:", doc.data());
        } else {
            // doc.data() will be undefined in this case
            console.log("No such document!");
        }
    });
    ...
}

正如我所说,doInsert可以实现,实现:

module.exports.doInsert = () => {
    db.collection('customers').add({
        phoneNumber: 123456,
        active: true,
        registration: new Date()
    }).then(it => console.log(`added ${it}`));
}

现在查询部分,它突出显示一个元素,即impl:

module.exports.customerByPhone = phone => {
    return db.collection('customers')
        // .where('phoneNumber', '==', phone)
        .limit(1)
        .get()
};

最后来自数据库的图片,不是用EN而是很干净的: enter image description here

我想念什么?

1 个答案:

答案 0 :(得分:1)

您将电话号码存储为整数:

struct RecoveryServerConnector
 {
    void Init(string ip, uint16_t port)
    {      
     pthread_t pth;
     pthread_create(&pth,NULL,&RunThread,this);
    }
    void ConnectionPoller()
    {
      //some work here
    }
     static void* RunThread(void* context)
    {
      (RecoveryServerConnector*)(context)->ConnectionPoller();
    }

};

但是您正在用字符串查询它:

db.collection('customers').add({
    phoneNumber: 123456,  // THIS IS AN INTEGER
    active: true,
    registration: new Date()
})

在Firestore中,字符串和数字永远不会相等,因此此查询将永远无法工作。

由于电话号码不是真正的整数。它们不代表数值,您永远也不会与它们匹配。因此,您应该将它们存储为字符串:

// req.body.phoneNumber is a string
db.customerByPhone(req.body.phoneNumber)

在致电db.collection('customers').add({ phoneNumber: '123456', // THIS IS A STRING active: true, registration: new Date() }) 时,请在数字两边加上引号,以便Firebase知道您要存储字符串。然后使用相同的字符串查询将找到该文档。