【问题标题】:How to correctly chain promises that all involve the mongo database [duplicate]如何正确链接所有涉及 mongo 数据库的承诺 [重复]
【发布时间】:2019-01-08 06:11:10
【问题描述】:

我是 Node 和 Mongo 的初学者,所以我需要一些帮助。我正在练习链接承诺和 MongoDB。我想将 2 个插入操作链接在一起。但是,当我运行此代码文件时,出现错误:“TypeError: Cannot read property 'db' of undefined 在 /Users/jenniferzhou/Documents/2018 - 2019/MEAN Practice/Guru99/E8/mongopractice5.js:12:22 在 process.internalTickCallback (internal/process/next_tick.js:77:7) " 该错误表明问题出在这行代码上:“var db = client1.db('EmployeeDB')”。但是,我不确定为什么这条线会返回错误。我知道 MongoClient.connect(url, { useNewUrlParser: true }) 返回一个承诺,但是这个承诺在某种程度上与第一个 .then(...) 返回的承诺不同吗?

var Promise = require('promise')
var MongoClient = require('mongodb').MongoClient
var url = 'mongodb://localhost:27017'
MongoClient.connect(url, { useNewUrlParser: true        }).then(function(client) {
     var db = client.db('EmployeeDB')
     db.collection('Employee').insertOne({
         Employeeid: 4,
         EmployeeName: "NewEmployee"
     })
    client.close()
}).then(function(client1) {
    var db = client1.db('EmployeeDB')
    db.collection('Employee').insertOne({
        Employeeid: 5,
        EmployeeName: "NewEmployee1"
    })
    client1.close()
}).catch(function(err) {
    console.log(err)
}) 

【问题讨论】:

标签: node.js mongodb promise


【解决方案1】:

连接和插入返回承诺。这些与then 方法链接。 IMO 也希望构建执行离散任务并返回承诺的函数,所以...

const MongoClient = require('mongodb').MongoClient

function mongoConnect(url) {
    return MongoClient.connect(url, { useNewUrlParser: true });
}

function mongoClose(db) {
    return db.close();
}

function insertEmployee(db, employee) {
    return db.collection('Employee').insertOne(employee);
}

function insertSomeEmployees() {
    let db;
    return mongoConnect('mongodb://localhost:27017').then(result => {
        db = result;
        return insertEmployee(db, { Employeeid: 4, EmployeeName: "NewEmployee" });
    }).then(() => {
        return insertEmployee(db, { Employeeid: 5, EmployeeName: "NewEmployee1" });
    }).then(() => {
        return mongoClose(db);
    }).catch(function(err) {
        console.log(err)
    }); 
}

【讨论】:

  • client和db有什么区别?客户是否拥有所有可用的数据库? (客户持有什么有术语吗?)
  • 我从 OP 代码中复制了它,认为这是您需要的东西。我见过的大多数 mongo 客户端使用只需要 connect 调用中的 db。我将对其进行编辑以符合惯例。
  • @JenniferZhou 已编辑。请注意,此版本仅引用 db 中的“Employee”集合,并没有引用 OP 中的“EmployeeDB”
  • 另一个答案:承诺现在在 JS 中是原生的。另请注意,另一个答案是使用异步有点松散,或多或少地同时开始两个插入,并且不知道其中一个何时完成。通常,我们希望在其他事情之前或之后严格执行某些事情,因此我们构建承诺链来控制它。
【解决方案2】:
var Promise = require('promise')
var MongoClient = require('mongodb').MongoClient
var url = 'mongodb://localhost:27017';

MongoClient.connect(url, { useNewUrlParser: true}).then(function(client) {
   var db = client.db('EmployeeDB');
   db.collection("Employee").insertOne({
       Employeeid: 4,
       EmployeeName: "NewEmployee"
      }).then(function(res) {
         console.log('Document inserted');
    });

    db.collection("Employee").insertOne({
        Employeeid: 5,
        EmployeeName: "NewEmployee1"
      }).then(function(res) {
        console.log('Document inserted');
     });
 }).catch(function (err) {
    console.log(err);
 })

您应该在每个请求结束后关闭。

而且你没有使用你导入的承诺库。

【讨论】:

  • 所以我想我不需要 require('promise') 。我怎么可以使用 then 函数?
  • @JenniferZhou 这是对象的方法,而不是您需要导入(或已全局定义)的静态函数。
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2018-12-30
  • 2015-06-12
相关资源
最近更新 更多