使用Promise操作MongoDB遇TypeError,请求排查代码问题
你的代码问题分析与修复方案
首先,你的代码有两个核心问题导致了报错:
1. Promise版MongoClient.connect的参数接收错误
MongoDB的MongoClient.connect如果使用Promise链式调用(而非传统回调函数),成功时只会返回数据库连接对象db,不会传入err参数。你原来的.then(function(err, db) { ... })是回调函数的写法,这就导致实际的db被当成第二个参数未被接收,db变量变成undefined,自然会抛出Cannot read property 'collection' of undefined的错误。
2. 未处理Promise的拒绝(错误)
你的代码没有添加.catch()来捕获连接或更新过程中可能出现的错误,所以Node.js抛出了UnhandledPromiseRejectionWarning——这个警告在未来Node.js版本中会直接终止进程。
修复后的代码(Promise链式写法)
const Promise = require('promise'); const MongoClient = require('mongodb').MongoClient; const url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) // 直接接收成功返回的db对象,无err参数 .then(db => { // 返回updateOne的Promise,继续链式处理结果 return db.collection('Employee').updateOne( { "EmployeeName": "Jeffrey" }, { $set: { "EmployeeName": "Jeffrey Scurgs" } } ); }) .then(updateResult => { console.log('更新操作完成,结果:', updateResult); // 操作完成后关闭数据库连接 MongoClient.close(); }) // 捕获所有可能的错误(连接失败、更新失败等) .catch(err => { console.error('操作过程中发生错误:', err); });
更易读的async/await写法
如果你的Node.js版本是8+,推荐用async/await简化Promise代码,逻辑更直观:
const Promise = require('promise'); const MongoClient = require('mongodb').MongoClient; const url = 'mongodb://localhost/EmployeeDB'; async function updateEmployeeName() { try { // 等待连接成功,获取db对象 const db = await MongoClient.connect(url); // 等待更新操作完成 const updateResult = await db.collection('Employee').updateOne( { "EmployeeName": "Jeffrey" }, { $set: { "EmployeeName": "Jeffrey Scurgs" } } ); console.log('更新成功:', updateResult); // 关闭数据库连接 db.close(); } catch (err) { // 统一捕获所有异常 console.error('出错了:', err); } } // 执行更新函数 updateEmployeeName();
内容的提问来源于stack exchange,提问作者Joe Wilson
相关产品推荐
相关产品推荐

