【问题标题】:MongoDB + node.js - SQL Select equivalentMongoDB + node.js - SQL Select 等效
【发布时间】:2016-05-14 12:36:46
【问题描述】:

我对 node.js 和 mongodb 还是很陌生。我需要一个函数,它将返回一个包含数据库结果的数组。当我在 php 中查询“SELECT * FROM table”时,它返回数组或对象数组。但是对于 node 和 mongo,我必须使用很多代码,这对我来说似乎是不必要的。所以我写了这个函数:

select: function (table, terms) {
    var rows = [];
    var find = function (error, db) {
        var collection = db.collection(table);
        var docs = collection.find(terms);
        docs.each(function (error, doc) {
            rows.push(doc);
        });
    };
    client.connect(url, find);
    return rows;
}

它将表名 [字符串] 和术语 [js 对象] 作为参数。我想让这个函数返回一个像这样的数组:[ { doc1 }, { doc2 }, { doc3 }, ...]。 当我在每个函数中记录变量 doc 时,没关系 - 有效的 javascript 对象。但是当我在推送所有文档后记录变量行时,它是空的 - []。函数 select() 的结果也是空数组 - []。

请问,是否有人知道可能出现的问题或使用某种类似方法从 MongoDB 获取数据?谢谢

【问题讨论】:

  • 你仍然可以像猫鼬一样使用 ORM。

标签: javascript node.js mongodb


【解决方案1】:

connect 函数是异步的,并在您的 return 语句之后完成。将您的 return 语句放在回调函数中,就在 docs.each(.....); 的右括号之后这样您就可以确定您的 return 语句将在您的数组被填充后执行。

为了完整性而编辑:return 语句当然不起作用,因为它从 find 中的函数返回。使用回调函数。

像这样:

select: function (table, terms, cb) {
    var rows = [];
    var find = function (error, db) {
        var collection = db.collection(table);
        var docs = collection.find(terms);
        docs.each(function (error, doc) {
            rows.push(doc);
        });
        cb(error, rows);
    };
    client.connect(url, find);
}

编辑:上面的例子(cb函数而不是return)

【讨论】:

  • 好吧,我试过了,但问题是,return 语句现在在回调函数中,所以它在回调中返回行而不是在 select 函数中。现在,当我调用 select 时,它什么也不返回(没有返回值的函数) - 未定义。我认为这是整个 javascript 中的一个很大的限制,如何从回调中返回值。不过谢谢
  • 是的,是的,忽略了这一点。但是要克服这个问题,您可以将第三个参数传递给 select 函数,这是另一个回调函数。函数(表、术语、cb)。完成后,您调用 return cb(rows),或者更好的 cb(error, rows)。
  • 是的,这是个好主意,不幸的是我正在使用项目结构,这使得这变得非常复杂。有一个访问数据库的模型(上面的代码来自那里),当调用 http 路由时,我从特定模型调用一个函数,从这里调用 select 函数,然后它处理结果并将格式化数据返回给路由。所以需要很多回调。但似乎我必须以这种充满回调的方式来做。也许我将来会实现猫鼬或类似的东西。
  • 由于许多调用的异步特性,在 JavaScript 中多次回调是唯一可行的方法。这是您在设计过程中必须牢记的。许多回调可能会导致丑陋和不清晰的代码(嵌套回调...),请查看异步模块(此处的好链接justinklemm.com/node-js-async-tutorial)以保持代码清晰。
猜你喜欢
  • 2011-03-03
  • 1970-01-01
  • 2022-01-11
  • 2011-12-09
  • 2017-12-09
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多