Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Firebase响应返回200但为空数组_Node.js_Firebase_Express_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Node.js Firebase响应返回200但为空数组

Node.js Firebase响应返回200但为空数组,node.js,firebase,express,google-cloud-firestore,google-cloud-functions,Node.js,Firebase,Express,Google Cloud Firestore,Google Cloud Functions,我目前正在使用Firebase和Firebase函数。我正在尝试获取集合中的文档(集合:“items”)。我试着做了一个GET,但是我只得到了一个200和空的身体 app.get('/api/read/items', (req, res) => { (async () => { try { let response = []; let itemRefs = db.collection('items').get().then(snapshot =

我目前正在使用Firebase和Firebase函数。我正在尝试获取集合中的文档(集合:“items”)。我试着做了一个GET,但是我只得到了一个200和空的身体

app.get('/api/read/items', (req, res) => {
(async () => {
    try {
        let response = [];
        let itemRefs = db.collection('items').get().then(snapshot => {
            snapshot.forEach((item) => {
                response.push(item.data());
            });
            console.log(response);
        });
        return res.send(response);
    } catch (error) {
        debug.log(error);
        return res.status(500).send(error);
    }
})();
});

有趣的是,当我查询一个特定项目时,我会得到包含文档数据的JSON主体:

app.get('/api/read/:item_id', (req, res) => {
(async () => {
    try {
        const document = db.collection('items').doc(req.params.item_id);
        let item = await document.get();
        let response = item.data();
        return res.status(200).send(response);
    } catch (error) {
        console.log(error);
        return res.status(500).send(error);
    }
})();
});
期待看到我犯了什么错误:)


谢谢你的帮助

数据从Firestore异步加载。执行
res.send(response)
时,
snapshot.forEach(…)
尚未运行

解决方案是从最内部的回调中向客户端发送响应:

app.get('/api/read/items', (req, res) => {
(async () => {
    try {
        let response = [];
        return db.collection('items').get().then(snapshot => {
            snapshot.forEach((item) => {
                response.push(item.data());
            });
            console.log(response);
            return res.send(response);
        });
    } catch (error) {
        debug.log(error);
        return res.status(500).send(error);
    }
})();
});

或者,您可以像在第二段代码中一样使用
wait

app.get('/api/read/items', (req, res) => {
(async () => {
    try {
        let response = [];
        let snapshot = await snapshot db.collection('items').get();
        snapshot.forEach((item) => {
            response.push(item.data());
        });
        return res.send(response);
    } catch (error) {
        return res.status(500).send(error);
    }
})();
});
您可以将其进一步简化为:

app.get('/api/read/items', (req, res) => {
(async () => {
    try {
        let snapshot = await snapshot db.collection('items').get();
        let response = snapshot.documents.map((item) => item.data());
        return res.send(response);
    } catch (error) {
        return res.status(500).send(error);
    }
})();
});

我想我已经找到了问题的根本原因,我无法解释原因,因为我对node/express缺乏了解。 在进行测试时,我有一个index.js文件,其中包含:

const serviceAccount = require("./permissions.json");
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const express = require('express');
const cors = require('cors');
const app = express();

const db = admin.firestore();
......
app.get('/api/read/items', (req, res) => {
    (async () => {
        try {
            let response = [];
            return db.collection('items').get().then(snapshot => {
                snapshot.forEach((item) => {
                    response.push(item.data());
                });
                console.log(response);
                return res.send(response);
            });
        } catch (error) {
            console.log(error);
            return res.status(500).send(error);
        }
    })();
});

// read item
app.get('/api/read/:item_id', (req, res) => {
    (async () => {
        try {
            const document = db.collection('items').doc(req.params.item_id);
            let item = await document.get();
            let response = item.data();
            return res.status(200).send(response);
        } catch (error) {
            console.log(error);
            return res.status(500).send(error);
        }
    })();
});


app.get('/api/read/geoFencedUsers', (req, res) => {
    (async () => {
        try {
            let response = [];
            return db.collection('geoFencedUsers').get().then(snapshot => {
                snapshot.forEach((geoFencedUser) => {
                    response.push(geoFencedUser.data());
                });
                return res.status(200).send(response);
            })
        } catch (error) {
            return res.status(500).send(error);
        }
    })();
});
尝试对read/geoFencedUsers执行GET调用返回200,但响应为空。 在修改了我的index.js之后,将get方法移到上面,解决了让所有3个调用都能返回正确的数据响应的问题:

app.get('/api/read/items', (req, res) => {
    (async () => {
        try {
            let response = [];
            return db.collection('items').get().then(snapshot => {
                snapshot.forEach((item) => {
                    response.push(item.data());
                });
                console.log(response);
                return res.send(response);
            });
        } catch (error) {
            console.log(error);
            return res.status(500).send(error);
        }
    })();
});

app.get('/api/read/geoFencedUsers', (req, res) => {
    (async () => {
        try {
            let response = [];
            return db.collection('geoFencedUsers').get().then(snapshot => {
                snapshot.forEach((geoFencedUser) => {
                    response.push(geoFencedUser.data());
                });
                return res.status(200).send(response);
            })
        } catch (error) {
            return res.status(500).send(error);
        }
    })();
});

// read item
app.get('/api/read/:item_id', (req, res) => {
    (async () => {
        try {
            const document = db.collection('items').doc(req.params.item_id);
            let item = await document.get();
            let response = item.data();
            return res.status(200).send(response);
        } catch (error) {
            console.log(error);
            return res.status(500).send(error);
        }
    })();
});

你好,Frank,感谢您的快速响应,我尝试了提供的代码片段,但不幸的是我得到了相同的响应。你好,Frank,感谢您改进的代码。我想我发现了这个问题,但我不确定我是否完全理解其根本原因。我将在下面添加代码。您的答案包括我提出的更改,所以我很确定这些更改现在起作用了。