无法读取未定义 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 读取未定义的属性‘集合’”

TypeError:无法读取未定义的属性“集合”这里有啥错误?

无法读取未定义和未处理的承诺拒绝的属性“捕获”

TypeError:无法读取未定义的属性“drop”

Nodejs Promise TypeError:无法读取未定义的属性'then'