无法读取未定义 MongoDB 的属性“集合”
Posted
技术标签:
【中文标题】无法读取未定义 MongoDB 的属性“集合”【英文标题】:Cannot read property 'collection' of undefined MongoDB 【发布时间】:2018-06-12 00:24:49 【问题描述】:我正在尝试使用 Node 和 MongoDB 执行 CRUD 操作。
我收到以下错误。
TypeError: 无法读取未定义的属性“集合”
const express = require('express')
const bodyParser= require('body-parser')
const MongoClient = require('mongodb').MongoClient
const app = express()
app.use(bodyParser.urlencoded(extended: true))
const url = 'mongodb://localhost:27017/testdb';
var db
MongoClient.connect(url, function(err, client)
if (err) return console.log(err)
var db = client.db('testdb');
)
app.post('/quotes', (req, res) =>
var collectionName = 'quotes';
var collection = db.collection(collectionName);
collection.save(req.body, (err, result) =>
if (err) return console.log(err)
console.log('saved to database')
res.redirect('/')
)
)
错误跟踪:
TypeError:无法读取未定义的属性“集合” 在 app.post (/var/www/html/Express/SimpleCrud/server.js:20:21) 在 Layer.handle [as handle_request] (/var/www/html/Express/SimpleCrud/node_modules/express/lib/router/layer.js:95:5) 在下一个(/var/www/html/Express/SimpleCrud/node_modules/express/lib/router/route.js:137:13) 在 Route.dispatch (/var/www/html/Express/SimpleCrud/node_modules/express/lib/router/route.js:112:3) 在 Layer.handle [as handle_request] (/var/www/html/Express/SimpleCrud/node_modules/express/lib/router/layer.js:95:5) 在 /var/www/html/Express/SimpleCrud/node_modules/express/lib/router/index.js:281:22 在 Function.process_params (/var/www/html/Express/SimpleCrud/node_modules/express/lib/router/index.js:335:12) 在下一个(/var/www/html/Express/SimpleCrud/node_modules/express/lib/router/index.js:275:10) 在 /var/www/html/Express/SimpleCrud/node_modules/body-parser/lib/read.js:130:5 在invokeCallback (/var/www/html/Express/SimpleCrud/node_modules/raw-body/index.js:224:16)
我正在使用 Mongodb 3.1
【问题讨论】:
【参考方案1】:代码中有一个简单的错误。在与 mongodb 服务器建立连接之前,您已经启动了 http 服务器。这就是为什么当您的帖子 api 加载到内存中时变量 db
未定义的原因。由于与 mongodb 的连接是异步的。为了使用 mongodb 实例,您必须首先连接 mongdb 服务器,然后启动 http 服务器并将 db 实例存储在全局或某些模块中,您可以要求并获取 db 实例以执行查询。
【讨论】:
如果我错了,请纠正我,我首先连接数据库服务器对吗? connect('mongodb:...),请您简要介绍一下您的解释,例如:在与 mongodb 服务器建立连接之前启动 http 服务器【参考方案2】:嘿嘿,
尝试:
const url = 'mongodb://localhost:27017';
更新:
根据mongodb
package v3.x,DB 的声明是单独完成的,而不是作为 URL 的一部分。
更多信息在这里:https://www.npmjs.com/package/mongodb
【讨论】:
感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 其长期价值,通过展示为什么这是解决问题的好方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。【参考方案3】:这是一个简单的关闭问题
var 是本地/全局范围,您有多个 var db
声明
var db <====== first declaration which is undefined
MongoClient.connect(url, function(err, client)
if (err) return console.log(err)
var db = client.db('testdb'); <======= second declaration where u connected to
the db which is undefined out of this scope
)
我个人更喜欢猫鼬,只要它不使用打字稿:D
几个例子:
const MongoClient = require('mongodb').MongoClient,
Server = require('mongodb').Server;
const mongoClient = new MongoClient(new Server('localhost', 27017));
mongoClient.open(function(err, mongoClient)
const db1 = mongoClient.db("mydb");
mongoClient.close();
);
或
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'myproject';
//Use connect method to connect to the server
MongoClient.connect(url, function(err, client)
assert.equal(null, err);
console.log("Connected successfully to server");
const db = client.db(dbName);
client.close();
);
source
【讨论】:
以上是关于无法读取未定义 MongoDB 的属性“集合”的主要内容,如果未能解决你的问题,请参考以下文章
nodejs/mongoDB - 类型错误:无法读取未定义的属性“集合”
Express-graphql“在运行突变和查询时无法使用 mongodb 读取未定义的属性‘集合’”