模块承诺:UnhandledPromiseRejectionWarning:TypeError:无法读取undefined的属性'collection'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块承诺:UnhandledPromiseRejectionWarning:TypeError:无法读取undefined的属性'collection'相关的知识,希望对你有一定的参考价值。

我刚刚在stackoverflow的讨论中搜索了我的问题,但与我发布的内容类似。因此,在这种情况下,我只想更新我的集合,然后使用'Promise'模块,而不是像我通常那样使用回调/匿名函数。但是当我在cmd中执行js的应用程序时出现错误。

这是我的简单代码:

var Promise = require('promise'); // use the 'promise' module
    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost/EmployeeDB';

    MongoClient.connect(url)
    	.then(function(err, db) {
    	    db.collection('Employee').updateOne({
    	        "EmployeeName": "Jeffrey"
    	    }, {
    	        $set: {
    	            "EmployeeName": "Jeffrey Scurgs"
    	        }
    	    });
    	}); 

当我在cmd中执行代码时出现错误:

(node:8600)UnhandledPromiseRejectionWarning:TypeError:无法在C: Users DELL guru99 5_Promise app_promise.js:7:9处读取未定义的属性'collection'at process._tickCallback(internal / process / next_tick.js: 189:7)(节点:8600)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误源于在没有catch块的情况下抛出异步函数,或者拒绝未使用.catch()处理的promise。 (拒绝ID:1)(节点:8600)[DEP0018]弃用警告:不推荐使用未处理的拒绝承诺。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。

那么,上面的代码中是否有任何错误的代码?

谢谢你的帮助......抱歉我的英语不好

答案

如果连接到数据库时出错,则db变量只能是未定义的。

您需要检查并修复显示的任何错误。您也可以分享错误

var Promise = require('promise'); // use the 'promise' module
    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost/EmployeeDB';

    MongoClient.connect(url)
    	.then(function(err, db) {
            if (err) {
              return throw err; // Check the error
            }
    	    db.collection('Employee').updateOne({
    	        "EmployeeName": "Jeffrey"
    	    }, {
    	        $set: {
    	            "EmployeeName": "Jeffrey Scurgs"
    	        }
    	    });
    	}); 
另一答案

你的方法是正确的,但你错过了一件事。

当你不提供回调参数时,mongo ORM会返回一个promise。这是更正后的代码:

MongoClient.connect(url)
    .then(function(db) { // <- db is first argument
        db.collection('Employee').updateOne({
            "EmployeeName": "Jeffrey"
        }, {
            $set: {
                "EmployeeName": "Jeffrey Scurgs"
            }
        });
    })
    .catch(function (err) {})
另一答案

到目前为止,这是最好的答案...由uday singh发布

MongoClient.connect(url)
.then(function(db) { // <- db is first argument
    db.collection('Employee').updateOne({
        "EmployeeName": "Jeffrey"
    }, {
        $set: {
            "EmployeeName": "Jeffrey Scurgs"
        }
    });
})
.catch(function (err) {})

之后,我想用嵌套然后探索Promise ...这里的代码......

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';

MongoClient.connect(url)
.then(function(db) {
    return db.collection('Employee').insertOne({
        Employeeid: 4,
        EmployeeName: "Ronan"
    })
    .then(function() {
        return db.collection('Employee').insertOne({
            Employeeid: 5,
            EmployeeName: "Teabouf"
        })
    })
}).catch(function(err) {
    console.error(err);
});

以上是关于模块承诺:UnhandledPromiseRejectionWarning:TypeError:无法读取undefined的属性'collection'的主要内容,如果未能解决你的问题,请参考以下文章

在开玩笑的模拟模块工厂中模拟一个承诺

为啥在带有 http 承诺的打字稿模块中未定义“this”

一个承诺的 mysql 模块将如何与 NodeJS 一起工作?

未捕获(承诺)类型错误:无法获取动态导入的模块:http://localhost:81/controllers/chatController

模块承诺:UnhandledPromiseRejectionWarning:TypeError:无法读取undefined的属性'collection'

如何使用 promise 将数组从我的模块返回到我的 API?异步函数和承诺 - Node.js