【问题标题】:Call getUsers() function from MongoDB driver从 MongoDB 驱动程序调用 getUsers() 函数
【发布时间】:2015-08-18 03:36:41
【问题描述】:

我目前正在构建一个 api 应用程序,该应用程序使用 Sailsjs(例如用户)检查状态并获取各种类型的 dbs(即 Mongo、MySQL)的信息,具体取决于用户输入。这是我正在处理的代码的 sn-p。本地主机只是我要连接的测试数据库,但将来它将由用户提供。

      var mp = require('mongodb-promise');
      var MongoClient = require('mongodb');



  mp.MongoClient.connect("mongodb://@localhost:27017/test")
      .then(function(db){
          db.getUsers().then(function(users){
           res.ok(users);
         })
      })
   .fail(function(err) {
    console.log(err);
})

我正在尝试对异步问题使用 Promise。我遇到的问题是它不起作用。它告诉我 Object[object object] 没有方法“getUsers”。我已经搜索过,似乎找不到有效的解决方案。

如果我将函数更改为以下,我会返回一些数据。

 mp.MongoClient.connect("mongodb://@localhost:27017/IMS")
     .then(function(db){
        db.stats().then(function(stats){
         return res.ok(stats);
        })
    })
   .fail(function(err) {
    console.log(err);
    dbObject.vipUp = false;
    }) 

我不确定问题是什么或如何解决。

【问题讨论】:

    标签: javascript node.js mongodb sails.js mongodb-query


    【解决方案1】:

    您在这里所做的是使用节点本机驱动程序方法来连接和检查数据库。事实上,在这个 API 中或实际上在任何其他 API 中都没有像 .getUsers() 这样的“方法”。

    .getUsers() 函数只是一个“shell 助手”,基本上是这样实现的:

    function (args) {
        var cmdObj = {usersInfo: 1};
        Object.extend(cmdObj, args);
        var res = this.runCommand(cmdObj);
        if (!res.ok) {
            var authSchemaIncompatibleCode = 69;
            if (res.code == authSchemaIncompatibleCode ||
                    (res.code == null && res.errmsg == "no such cmd: usersInfo")) {
                // Working with 2.4 schema user data
                return this.system.users.find({}).toArray();
            }
    
            throw Error(res.errmsg);
        }
    
        return res.users;
    }
    

    所以您应该在这里看到的是,这通常包含一个“命令”表单,或者为了与 MongoDB 2.4 兼容而退回到查询当前数据库上的 system.users 集合。

    因此,不要调用不存在的方法,而是需要使用.command() 方法:

    mp.MongoClient.connect("mongodb://@localhost:27017/test")
          .then(function(db){
              db.command({ "usersInfo": 1}).then(function(users){
               res.ok(users);
             })
          })
       .fail(function(err) {
        console.log(err);
    })
    

    或者在连接到 MongoDB 2.4 实例的情况下,然后从 .collection() 获取:

    mp.MongoClient.connect("mongodb://@localhost:27017/test")
          .then(function(db){
              db.collection('system.users').find().toArray().then(function(users){
               res.ok(users);
             })
          })
       .fail(function(err) {
        console.log(err);
    })
    

    无论如何,您确实应该在应用程序的其他地方建立数据库连接(或重新使用来自另一个商店的底层驱动程序连接),然后在已建立的连接上调用方法。这总是比根据您要检索的信息的请求创建连接更可取。

    此外,node native driver 的最新版本支持开箱即用的承诺。所以可能不需要配置其他任何东西,这取决于你打算如何使用它。

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      相关资源
      最近更新 更多