【问题标题】:Read one Firebase database entry once and return its value读取一个 Firebase 数据库条目并返回其值
【发布时间】:2017-06-15 01:50:37
【问题描述】:

我正在尝试从 firebase 数据库条目中获取数据。用例如下:我将使用 GeoQuery 库查询一个带有纬度、经度和半径的 Web API,该库提供与数据库条目键关联的数据库结构。我使用 key_entered 事件管理器来触发所有匹配的位置数据库条目。

我现在想检查关联的数据时间戳是否比现在更新,但我在从 Promise 中获取数据时遇到了一些困难。我知道由于 Promises 的异步性质,下面的代码不起作用,但是是否有可能将一次的数据与变量相关联,例如等待 Promise 返回一些东西直到继续(比如 await 等)?

我在这里完全了解 node.js 的异步特性,但我必须将数据返回到 res.send,因为它提供了一个封闭的 API 调用。

我也已经使用回调函数在 db 查询承诺中调用并尝试将其与数据相关联,但效果不佳。

function queryGeoLocation(req, res) {
try {
    const lat = parseFloat(req.params.lat);
    const long = parseFloat(req.params.long);
    const radius = parseFloat(req.params.radius);

    let geoQuery = geoFire.query({center: [lat, long], radius: radius});

    data = new QueryData(); //Use this to handle data asynchronously
    geoQuery.on("key_entered", (key, loc, dist) => {
        isFutureEvent = false;
        admin.database().ref("/events/").child(key).once("value").then((snapshot) => {
            if(Date.parse(snapshot.val().date) >= Date.now())
                isFutureEvent = true;
        }).catch(() => {
        });
        console.log(isFutureEvent);

        if (isFutureEvent){
            data.add(key, loc, dist);
        }
    });

    // When ready directly cancel the query provider and return data (since we only want to read once)
    geoQuery.on('ready', () => {
        geoQuery.cancel();
        res.send(data.getData());
    });
} catch (err) {
    res.status(500).send("Error: " + err);
}

}

【问题讨论】:

  • 真正你应该在这里做的是让 queryGeoLocation 返回一个用调用者需要的数据解析的承诺。调用者通过在该承诺上使用 then() 来使用该承诺来对数据的可用性做出反应。
  • 是的,这对我来说是个好方法。我不知道我可以在 http 请求中返回 Promise。是否可以通过我目前在客户端使用的 XMLHttpRequest 来处理这样的返回?
  • 有一个名为 request-promise 的 node.js 模块,它返回一个在 HTTP 请求完成时解析的承诺:npmjs.com/package/request-promise
  • 不幸的是,我没有完全理解它。我想要做的是获取查询位置附近的多个条目,据我了解,我无法用一个 Promise 来处理这个问题。是否还有关于 Promise 实际工作原理的任何文档,它是否让 http 连接打开直到数据交换,并且 request-promise 是否考虑到这一点,还是它是对 http 请求的简单承诺?

标签: javascript node.js firebase asynchronous es6-promise


【解决方案1】:

我自己通过链接 Promises 解决了这个问题。也许有点过于复杂,但我正在努力。

function queryGeoLocation(req, res) {
    try {
        const lat = parseFloat(req.params.lat);
        const long = parseFloat(req.params.long);
        const radius = parseFloat(req.params.radius);

        let geoQuery = geoFire.query({center: [lat, long], radius: radius});

        getGeoData = function(geoQuery) {
            return new Promise(function (resolve, reject) {
                data = new QueryData();
                geoQuery.on("key_entered", (key, loc, dist) => {
                    data.add(key, loc, dist);
                });

                geoQuery.on('ready', () => {
                    geoQuery.cancel();
                    resolve(data.getData());
                });
            });
        };

        dbQuery = function (key) {
            return new Promise(function(resolve, reject) {
                admin.database().ref("/events/").child(key).on('value', (data) => {
                    if (Date.parse(data.val().date) < Date.now())
                        resolve(false);
                    else
                        resolve(true);
                });
            });
        };

        checkIfDateIsNewer = function(geoData) {
            return new Promise(function (resolve, reject) {
                for (let key in geoData){
                    if(geoData.hasOwnProperty(key)) {
                        dbQuery(key).then((isNewer) => {
                            if (!isNewer)
                                delete geoData[key];
                        });
                    }
                }

                resolve(geoData);
            });
        };

        getGeoData(geoQuery).then(checkIfDateIsNewer).then(function(data) {
            res.send(data);
        }).catch((err) => {
            res.status(500).send("Error: " + err);
        });
    } catch (err) {
        res.status(500).send("Error: " + err);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2018-10-12
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多