【问题标题】:Mongodb native connections from nodejs return undefined databases list来自 nodejs 的 Mongodb 本机连接返回未定义的数据库列表
【发布时间】:2021-07-23 14:19:44
【问题描述】:

我刚开始在没有 mongoose 的情况下使用 Mongodb(以摆脱模式),并想创建一个具有各种导出函数的简单模块,以在我的应用程序的其余部分中使用。我已经粘贴了下面的代码。

我遇到的问题是 databasesList.databases 以未定义的形式返回,我不知道为什么。我的集群上应该有 2 个数据库,每个数据库中有一个集合。

作为一个切题的问题,我想也许我会改为检查集合(现在已注释掉),但虽然我找到了这个页面 (https://docs.mongodb.com/manual/reference/method/db.getCollectionNames/),但函数 getCollectionNames 似乎不存在。现在我想知道我是否使用了错误的文档,这就是我的数据库返回未定义的原因。

const client = new MongoClient(uri)
const connection = client.connect( function (err, database) {
    if (err) throw err;
    else if (!database) console.log('Unknown error connecting to database');
    else {
        console.log('Connected to MongoDB database server');
    }

});

module.exports = {
    getDatabaseList: function() {
        console.log('start ' + client);

        databasesList = client.db().admin().listDatabases();
        //collectionList = client.db().getCollectionNames();
        //console.log("Collections: " + collectionList);
    
        console.log("Databases: " + databasesList.databases);
        //databasesList.databases.forEach(db => console.log(` - ${db.name}`));
    }
}```

【问题讨论】:

  • 您需要参考MongoDB NodeJS Driver API 以获得适当的方法。有时驱动版本有不同的名称。
  • 谢谢!我确实找错地方了

标签: node.js mongodb node-mongodb-native


【解决方案1】:

你的代码是正确的,只需要改变一些东西。

module.exports = {
    getDatabaseList: async function() {
        console.log('start ' + client);

        databasesList = await client.db().admin().listDatabases();
        //collectionList = await client.db().getCollectionNames();
        //console.log("Collections: " + collectionList);
    
        console.log("Databases: " + databasesList.databases);
        databasesList.databases.forEach(db => console.log(` - ${db.name}`));
    }
}

您必须声明 async 函数并同时使用 await

asyncawait 关键字使 asynchronous、基于 Promise 的行为能够以更简洁的风格编写,避免了显式配置的需要承诺链。

【讨论】:

  • 啊,我添加了异步,它立即起作用了。正如你所说,这样做比尝试创建那些长长的承诺链要容易得多!
【解决方案2】:

您可以使用这种模块化方法来构建您的数据库访问代码:

index.js:运行您的数据库应用程序代码,例如列出数据库名称、集合名称和从集合中读取。

const connect = require('./database');
const dbFunctions = require('./dbFunctions');

const start = async function() {
    const connection = await connect();
    console.log('Connected...');
    const dbNames = await dbFunctions.getDbNames(connection);
    console.log(await dbNames.databases.map(e => e.name));
    const colls = await dbFunctions.getCollNames(connection, 'test');
    console.log(await colls.map(e => e.name));
    console.log(await dbFunctions.getDocs(connection, 'test', 'test'));
};

start();

database.js::创建连接对象。此连接用于您的所有数据库访问代码。一般来说,单个连接会创建一个连接池,这可以在整个小型应用程序中使用

const { MongoClient } = require('mongodb');
const url = 'mongodb://localhost:27017/';
const opts = { useUnifiedTopology: true };

async function connect() {
    console.log('Connecting to db server...');
    return await MongoClient.connect(url, opts );
}

module.exports = connect;

dbFunctions.js::用于访问数据库详细信息、集合详细信息和查询特定集合的各种函数。

module.exports = {
    // return list of database names
    getDbNames: async function(conn) {
        return await conn.db().admin().listDatabases( { nameOnly: true } );
    },
    // return collections list as an array for a given database
    getCollNames: async function(conn, db) {
        return await conn.db(db).listCollections().toArray();
    },
    // return documents as an array for a given database and collection
    getDocs: async function(conn, db, coll) {
        return await conn.db(db).collection(coll).find().toArray();
    }
}

【讨论】:

  • 您打算同时使用所有这些吗?我看到了 database.js 和 dbFunctions.js 是如何组合在一起的,但我不确定我是否理解为什么要运行 index.js。这更像是一个初始化程序来收集一些信息以供以后查询使用吗?另外,我原本打算更多地使用这种方法,但后来觉得我需要为每个可能从 dbFunctions.js 调用函数的文件启动一个连接(从 database.js)。我对文件之间共享的“全局”值的想法有点挣扎。
  • 一般来说,Index.js 只是一个初始化器。在这里,我展示了一些数据库方法的用法——这个功能不是从启动模块完成的(除非它是一个演示或在这种情况下测试数据库 API)。单个数据库连接用于所有功能。它是/可以传递给其他模块。如果您将其扩展为使用 ExpressJS/routes/apis,所有这些都可以正常工作。那么你在启动模块中就没有所有这些 db 方法调用 - index.js 将只是一个启动程序。
猜你喜欢
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 2017-03-19
  • 2015-06-08
  • 2014-02-09
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多