MongoDb和expressJS试图进行代码

时间:2016-04-15 10:47:35

标签: mongodb express web

  function _allUsers(callback){
     var db = connect.get();

    db.collection("users").find({}).toArray(function(err,data){
      if(err){
        callback(err);
    }else{
        callback(null,data);
    }
 });
}

我正在尝试理解这段代码,我一直在寻找网络,但我发现解释有点不明白(我是Mean的新手),所以我的问题是:

  1. Collection方法有什么作用?我不确定,但字符串“users”只是我们所有用户的收藏品名称?

  2. 为什么我们必须在这种情况下使用回调? (我发现回调非常令人困惑)。

  3. 为什么我们必须给一个匿名函数赋值函数?

  4. 我可以使用漂亮的方法()而不使用任何匿名函数作为参数来代替toArray吗?

3 个答案:

答案 0 :(得分:1)

MEAN Stack是一个软件程序包,支持用所有javascript编写的应用程序。这意味着您可以使用数据库中的javascript,以及后端和前端。

MEAN实际上代表堆栈中包含的每个软件程序的第一个字符。 M ongoDB, E xpressjs, A ngularJS和 N odeJS。

<强> 1

MongoDB是一个NoSQL数据库,它使用BSON(类似于JSON)来存储所谓的documents。查看文档,就好像它是传统数据库中的单个实体或行一样。这些实体(或行)存储在collections(文档集合)中,可以与表进行比较。

因此,您对第一个问题的回答是打开users集合,该集合授予对所有用户文档的访问权限。

<强> 2

NodeJS在设计上是异步的。这允许NodeJS在单个线程*上运行时执行大量操作。因为NodeJS是单线程的,所以我们需要一种编写代码non-blocking的方法,这意味着我们可以启动一个操作,继续执行其他代码并在该操作完成时返回。

在您的情况下,我们请求访问users集合,这需要一些时间。为了允许我们的应用程序的其他部分继续处理,我们使用回调。当我们访问我们的集合时,我们会执行回调,并且当我们第一次请求访问时,我们可以执行我们想要执行的任何操作。

* NodeJS实际上在多个线程上运行,但开发人员永远不必担心多线程,NodeJS会为我们做这件事。'

第3

这正是前一点的内容。

  

.toArray()方法返回一个包含游标中所有文档的数组。该方法完全迭代光标,将所有文档加载到RAM中并耗尽光标。 Source

.toArray()是一项计算密集型操作。由于我们不想等到直到.toArray()完成但是继续处理我们的其余代码,我们给它一个callback,以便我们可以在它准备就绪时回到我们的集合处理。

<强> 4

从我可以从docs读到的内容我想你确实可以编写阻止代码并以这种方式执行:

var users = db.collection("users").find({}).toArray();

然而,这将完全阻止您的代码。没有充分的理由这样做。

免责声明:为了便于理解,我在此解释中遗漏了或过于简单的细节。

答案 1 :(得分:0)

  1. db.collection('users') this will return the users collection instance
  2. we are using callback for asynchronous
  3. the annonymous function in toArray is its callback
  4. this is dependent on the library in use..

without any annonymous function as a parameter

expressjs is an asynchronous programming, we need callback || Promises

答案 2 :(得分:0)

您可以将MySQL中的表格视为表格。集合由文档(MySQL中的行/项/记录)组成。您的示例调用Users集合并查找其中的所有文档(记录) 关于回调 - NodeJS / Express通常是面向回调的。这是他们使用的模式,大多数代码都使用它,因为它是asynchronous。如果您需要确保在其他代码段之后立即执行某些代码段,则必须使用回调(或承诺)。
调用toArray()取决于你的回调期望。如果回调需要find()方法返回的Query对象,则可以跳过调用此方法。所有这些都取决于你的回调 您也可以使用非匿名函数,但必须记住asynchronous逻辑并继续使用回调/承诺。您可以在this Quora的文章中阅读有关回调和承诺的更多信息 Here您可以找到有关find()方法的更多信息。