来自nodejs的Mongodb本机连接返回未定义的数据库列表



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

我遇到的问题是databaseList.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关键字使异步、基于承诺的行为能够以更干净的风格编写,从而避免了显式配置承诺链的需要。

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

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

相关内容

最新更新