【问题标题】:Trying to add array to firebase but having issue because no async nature of nodejs尝试将数组添加到 firebase 但由于 nodejs 没有异步性质而出现问题
【发布时间】:2015-12-04 02:23:37
【问题描述】:

我是 nodejs、angularjs 和 firebase 世界的初学者。我正在尝试将数据加载到 firebase 但由于 nodejs 的异步性质而出现问题。 我的目的是从firebase搜索现有列表,如果有一些数据,然后将新元素添加到该列表并将其写回firebase。下面是我的代码,但我面临的问题有点奇怪。它工作正常并继续向数组添加数据,直到我关闭正在运行的节点服务器。一旦我重新启动该节点服务器,由于 nodejs 的异步性质,它会先将新元素添加到数组中,然后再从 firebase 获取数组数据。

我的问题是,我们如何限制这种情况发生?我基本上想获取存储在 firebase 下的数组并在 firebase 上为其添加一个值。我正在尝试将我们从 firebase 收到的这些数据作为 expressjs API 的输出返回。

我们可以将此 firebase 视为一些 WS API,它也可以获取数据并插入数据。

请帮忙。

var ref = new Firebase('FIREBASE URL/'+req.query.id);   
var list = [];      
ref.on('value', function(snap) { list = snap.val();});
list.push(req.query.searchtext);
ref.set(list);

var result = {key: req.query.id, mainList: list};
res.json(result);

【问题讨论】:

    标签: javascript node.js asynchronous express firebase


    【解决方案1】:

    “诀窍”是将依赖操作放入回调中。所以不要说“先获取值,然后添加搜索文本,然后返回 JSON 响应”,而是将其重构为“当我们获取值时,添加搜索文本并返回 JSON 响应”。

    var ref = new Firebase('FIREBASE URL/'+req.query.id);   
    ref.once('value', function(snap) { 
        var list = snap.val();
        list.push(req.query.searchtext);
        ref.set(list);
    
        var result = {key: req.query.id, mainList: list};
        res.json(result);
    });
    

    请注意,我从on() 更改为once(),因为我担心你会在那里触发无限循环。如果不是这种情况,当然可以随意改回来。

    【讨论】:

    • 这很好用。非常感谢。我之前确实尝试过这种方法来在回调中添加所有内容,但正如你刚才提到的,由于 on() 它正在无限循环,但我将它更改为 once() 现在它工作正常。再次非常感谢您。
    • 要考虑的另一件事:此代码将下拉数组,添加搜索文本并将整个数组写回。这是非常低效的。您应该查看 Firebase 的文档,了解我们为什么不建议使用数组。 firebase.com/docs/rest/guide/…
    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多