मैं क्लाउड फ़ंक्शन का उपयोग करके फायरस्टोर में अपने संग्रह "शहरों" में दस्तावेज़ प्राप्त करने का प्रयास कर रहा हूं, संग्रह ट्यूटोरियल के समान है।

'use strict';

const admin = require('firebase-admin');

admin.initializeApp({
    credential: admin.credential.applicationDefault()
});

var db = admin.firestore();
var test ;
exports.helloWorld = (req, res) => {
var citiesRef = db.collection('cities/');
var allCities = citiesRef.get()
    .then(snapshot => {
        snapshot.forEach(doc => {
            //console.log(doc.id, '=>', doc.data());
            test = doc.data();
            res.status(200).send("Data");
        });
    })
    .catch(err => {
        console.log('Error getting documents', err);
    });
  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(test);
};

समस्या यह है कि स्नैपशॉट खाली है इसलिए यह मेरा प्रतिक्रिया संदेश वापस नहीं करता है। क्लाउड फ़ंक्शन के लिए संग्रह में सभी डेटा को पढ़ने का सही तरीका क्या है?

0
Harvey 18 नवम्बर 2020, 06:11

2 जवाब

सबसे बढ़िया उत्तर

आपको प्रतिक्रिया तभी भेजनी चाहिए जब डेटाबेस से डेटा प्राप्त हो।

exports.helloWorld = (req, res) => {
    var citiesRef = db.collection('cities');
    var allCities = citiesRef.get()
        .then(snapshot => {

            if (snapshot.empty) {
                return res.status(404).send("No data to found");
            } 

            // create data array
            const snapshotData = [];

            snapshot.forEach(doc => {
                test = doc.data();

                // put data into the array
                snapshotData.push(test);
            });

            // send response with all data
            res.status(200).send(snapshotData);
        })
        .catch(err => {
            console.log('Error getting documents', err);
            res.status(500).send(err);
        });
    };
0
Rajitha Udayanga 18 नवम्बर 2020, 06:44

मुझे ऐसा लगता है कि res.send() पर आपकी कोई भी कॉल अच्छी जगह पर नहीं है। इसे पूरे समारोह के लिए केवल एक बार बुलाया जाना चाहिए। आपके पास एक लूप के अंदर है (जो क्वेरी के कई दस्तावेज़ लौटाने पर बुरा होगा), और दूसरा एक प्रतिक्रिया भेजने वाला पहले क्वेरी के साथ कुछ भी होता है, जो एसिंक्रोनस है। कॉल करने से प्रोग्राम रुकता नहीं है - यह सिर्फ एक नए वादे के साथ तुरंत लौटता है। (आपको निश्चित रूप से समझना होगा कि क्लाउड फ़ंक्शंस का प्रभावी उपयोग करने के लिए जावास्क्रिप्ट कैसे काम करता है, अन्यथा कुछ भी आपकी अपेक्षा के अनुरूप काम नहीं करेगा।)

कुछ और इस तरह का प्रयास करें, जहां आप क्वेरी पूरी होने के बाद केवल एक प्रतिक्रिया भेजते हैं, और उस मामले में भेजें और त्रुटि प्रतिक्रिया भी भेजते हैं।

exports.helloWorld = (req, res) => {
  var citiesRef = db.collection('cities/');
  var allCities = citiesRef.get()
    .then(snapshot => {
        snapshot.forEach(doc => {
            //console.log(doc.id, '=>', doc.data());
            test = doc.data();
        });
        res.status(200).send(test);
    })
    .catch(err => {
        console.log('Error getting documents', err);
        res.status(500).send("Some error");
    });
});
0
Doug Stevenson 18 नवम्बर 2020, 06:27