Firebase获取请求后返回未定义

时间:2020-05-22 14:57:25

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

我有一个userService模块:

class UserService {
    constructor(reference) {
        this.usersRef = reference;
    }

    async getUser(uid) {
        let docs;
        await this.usersRef.where('uid', '==', uid).get()
        .then(result => {
            result.forEach(doc => {
                return doc.data();
            });
        });
    }
}

我得到了在服务中调用getUser(uid)函数的以下路由:

router.route('/mp3').post((req, res) => {
var storage = multer.diskStorage({
    destination: './files/',
    filename: function (req, file, cb) {
        cb(null, "test" + ".mp3");
    }
});
var upload = multer({ storage: storage }).any();
upload(req, res, async (err) => {
    if(err) {
        console.log(err);
        return res.end("Error uploading file.");
    } else {

       let user = userService.getUser('AhtlOSge59bGGuKd43dEjUgt7Di4');

       user.then(function(result) {
        // this is undefined
        console.log(result)
       });
    }
});

});

所以在第二个代码块中,我试图记录调用getUser(uid)的结果,但是它似乎是未定义的?

1 个答案:

答案 0 :(得分:1)

您的return doc.data()语句实际上没有向getUser的调用者返回任何内容。 getUser当前返回始终解析为undefined的Promise,因为getUser从不返回实际值。 (此外,您的docs变量不会执行任何操作-它永远不会被使用。)

请注意,您的return语句仅返回传递给forEach的匿名函数的值。该返回值不会转义该微小函数。如果要返回与查询匹配的第一个文档,则需要安排通过从QuerySnapshot中提取文档来直接从getUser返回。

    async getUser(uid) {
        const snapshot = await this.usersRef.where('uid', '==', uid).get()
        if (snapshot.size > 0) {
            return snapshot.docs[0].data();
        }
    }