Mongodb客户端连接TypeError NULL问题
使用 Mongodb 开发一个简单的 nodejs express 应用程序。当我尝试使用返回的连接对象时,我收到一个 typeerror 无法从 null 读取。连接对象不为 null,因此我不清楚错误消息实际上试图指出什么。
生成错误的代码行是:
const silos = conn.db('toolkit').collection('silos')
我在 console.log("Connection: ",conn) 之前有一个调试 console.log
我正在检查连接回调中的错误,错误为 null。在此问题出现之前,我遇到了连接和用户名/身份验证方面的问题,因此我知道错误检查工作正常,因为它会在错误登录时触发。
错误是:
TypeError: Cannot read property 'db' of null
at mongoClient.connect (/var/projects/drake/Routes/Silos.js:22:28)
at err (/var/projects/drake/node_modules/mongodb/lib/utils.js:415:14)
at executeCallback (/var/projects/drake/node_modules/mongodb/lib/utils.js:404:25)
at executeOperation (/var/projects/drake/node_modules/mongodb/lib/utils.js:422:7)
at MongoClient.connect (/var/projects/drake/node_modules/mongodb/lib/mongo_client.js:168:10)
at getSilos (/var/projects/drake/Routes/Silos.js:18:17)
at Layer.handle [as handle_request] (/var/projects/drake/node_modules/express/lib/router/layer.js:95:5)
at next (/var/projects/drake/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/var/projects/drake/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/var/projects/drake/node_modules/express/lib/router/layer.js:95:5)
console.log 行生成此消息:
Connection: MongoClient {
这是我用于 Mongo 连接的代码。它位于一个文件中,并且导出了 MongoClient 对象,该对象在其他文件中用于连接到数据库。
const url = `mongodb://${process.env.MONGO_HOST}:${process.env.MONGO_PORT}`
const opts = {
useNewUrlParser: true,
authMechanism: process.env.MONGO_MECH,
authSource: process.env.MONGO_SRC,
auth: {
user: process.env.MONGO_USER,
password: process.env.MONGO_PWD
}
}
const mongoClient = require('mongodb').MongoClient;
const objectID = require('mongodb').ObjectID
const mongo = new mongoClient(url,opts)
module.exports.mongoClient = mongo
这是我提取该代码并调用连接的地方。 导入代码:
const { mongoClient } = require('../mongo')
使用导入的代码:
mongoClient.connect( (err, conn) => {
if (err) err(res,err, "Database Connection Error", 500)
console.log("Connection: ",conn)
const silos = conn.db('toolkit').collection('silos')
最后一行是出现错误的行。
console.log 的结果
Connection: MongoClient {
造成这种情况的一个常见原因是,在实际建立连接之前,您尝试与 mongodb 服务器进行交互。我可能错了,但我怀疑您可能以错误的顺序调用了数据库操作。为避免这种情况,请确保在对集合运行查询之前已成功连接到 mongodb 服务器。如果您使用的是 mongoose,那么
mongoose.connect('/a/valid/mongo/uri')
将使
mongoose.connection
成为可以交互的有效对象。
您能否使用您的连接处理代码更新您的问题?
不知道这是怎么回事。
我很感谢大家对我的反馈。
我花了一个周末的时间从头开始重写代码,这次成功了。我相信我做了同样的事情。一定是我忽略了一个拼写错误。
无论如何,我想分享一下我遇到这个问题的经历。我使用 Mongoose 建立连接,但它会在“副本集”或“身份验证错误”上崩溃。最终,我决定像您一样改用 MongoClient。这是因为 “如果您使用未连接的模型,Mongoose 默认不会抛出任何错误。” 。
改用 Mongo 后,连接错误也返回了“null”。我搜索了又搜索,尝试了几种方法,包括复制您的代码并添加“auth”选项等。我最终切换回了 Mongoose(尽管这对我解决问题没有影响),并执行了以下操作:
-
创建一个具有 ReadWrite 能力的新用户(没有立即帮助,但 绝对 需要,因为在没有正确的“新”用户的情况下部署到 Heroku 时会出现错误。)。我的 MongoDB 帐户中现在有 两个 个用户。
-
将以下内容添加到我的(Mongoose)架构中:
///Already had this:
let testSchema = new Schema {
foo: String,
bar: Number
}
///Added:
,{
bufferCommands: false,
autoCreate: false
});
- 由于数据库仍然为空,我在创建模型后添加了以下代码。
///Already had this:
let Test = mongoose.model('Test', testSchema);
///Added:
Test.createCollection();
我相信它随后“真正”启动了收集。在 mongo shell 中,我知道集合只有在其中有项目时才可见。现在 app.js 在启动时没有崩溃,我设法使用 HTML 中的表单将文档添加到数据库,并且成功了。我现在有一个连接到我的应用程序的工作数据库。希望这可以帮助任何人访问此页面。