Node.js连接MongoDB报错:TypeError: Cannot read properties of undefined
解决Node.js连接MongoDB时的TypeError问题
问题代码
var mongocilent=require('mongodb').mongocilent var state = {db:null} module.exports.connect=function(done){ var url ='mongodb://localhost:27017' var dbname = "shopping" mongocilent.connect(url,(err,data)=>{ if(err)return done(err) state.db=data.db(dbname) done() }) module.exports.get=function(){ return state.db
报错信息
npm start > shopping-cart@0.0.0 start > nodemon ./bin/www [nodemon] 2.0.19 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node ./bin/www` /home/shinoy/Desktop/binoy/shopping cart/config/connection.js:8 mongocilent.connect(url,(err,data)=>{ ^ TypeError: Cannot read properties of undefined (reading 'connect') at module.exports.connect (/home/shinoy/Desktop/binoy/shopping cart/config/connection.js:8:17) at Object.<anonymous> (/home/shinoy/Desktop/binoy/shopping cart/app.js:10:4) at Module._compile (node:internal/modules/cjs/loader:1120:14) at Module._extensions..js (node:internal/modules/cjs/loader:1174:10) at Module.load (node:internal/modules/cjs/loader:998:32) at Module._load (node:internal/modules/cjs/loader:839:12) at Module.require (node:internal/modules/cjs/loader:1022:19) at require (node:internal/modules/cjs/helpers:102:18) at Object.<anonymous> (/home/shinoy/Desktop/binoy/shopping cart/bin/www:7:11) at Module._compile (node:internal/modules/cjs/loader:1120:14) Node.js v18.7.0 [nodemon] app crashed - waiting for file changes before starting...
错误分析
- 拼写错误:
mongocilent是拼写错误,正确的导出对象是MongoClient(注意首字母大写,拼写为MongoClient),这是报错的核心原因——你试图读取一个不存在的模块属性,导致mongocilent变量为undefined,调用connect方法自然触发错误。 - 语法错误:代码存在未闭合的大括号:
connect函数没有结束的},get函数也缺少闭合的},会导致Node.js解析代码时出错。 - 连接逻辑细节:MongoDB驱动中,
connect回调返回的是客户端实例,虽然data.db(dbname)可以工作,但直接使用客户端对象获取数据库更规范。
修正后的代码
// 修正拼写,使用正确的MongoClient var MongoClient = require('mongodb').MongoClient; var state = { db: null }; // 闭合connect函数的大括号 module.exports.connect = function(done) { // 直接在URL中指定数据库名,简化代码 var url = 'mongodb://localhost:27017/shopping'; MongoClient.connect(url, (err, client) => { if (err) return done(err); // 直接将数据库实例存入state state.db = client.db(); done(); }); }; // 闭合get函数的大括号 module.exports.get = function() { return state.db; };
额外优化(MongoDB 4.x+版本)
如果使用的是MongoDB驱动4.x及以上版本,也可以用async/await写法让代码更清晰:
const { MongoClient } = require('mongodb'); const state = { db: null }; module.exports.connect = async function() { const url = 'mongodb://localhost:27017/shopping'; const client = await MongoClient.connect(url); state.db = client.db(); }; module.exports.get = function() { return state.db; };
内容的提问来源于stack exchange,提问作者Binoy P.r
相关产品推荐
相关产品推荐

