从MongoDB驱动程序调用getUsers()函数

时间:2015-08-18 03:36:41

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

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

      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;
    }) 

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

1 个答案:

答案 0 :(得分:2)

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

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; } 函数只是一个“shell帮助器”,基本上是这样实现的:

system.users

所以你应该在这里看到的是,这通常包含一个“命令”形式,或者为了与MongoDB 2.4的兼容性而回退,以查询当前数据库上的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); }) 集合。

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

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);
})

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

Any

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

此外,最新版本的node native driver支持承诺开箱即用。因此,根据您打算如何使用它,可能不需要进行任何其他配置。