Mongodb 来自 nodejs 的本地连接 return 未定义的数据库列表

Mongodb native connections from nodejs return undefined databases list

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

我遇到的问题是 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}`));
    }
}```

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

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 的行为以更简洁的风格,避免显式配置承诺链的需要。

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

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