Sync Promises用于初始化MongoDB数据库

问题描述 投票:0回答:1

我是Web开发的新手,但我有关于MongoDB和Nodejs驱动程序的问题,给出了以下代码:

let MongoClient = require('mongodb').MongoClient;
const url = MY_URL;
const dbConnected = MongoClient.connect(url);
let dbInit =  function (){
    dbConnected.then(
        (client) => {
            let db = client.db('DB_NAME');
            db.dropDatabase()
                .then( () => {})
                .catch( err => { throw err;})
            return client;
        }
    )
    .then(
        (client) =>{
            let db = client.db('knodels');
            db.collection('Users').insertMany([
                //data
            ])
            .then( () => {})
            .catch( err => { throw err;})
            return client;
       }
    )
    .then(
        (client) =>{            
            client.close();
        }
    )
    .catch((err) => {throw err;})
}

我想实现这些目标:

  1. 删除数据库
  2. 在删除后创建数据库并填充它
  3. 密切联系

当我运行该函数时,所有这些目标都实现了,但我认为代码有问题:

  • dbInit()运行时,一些UnhandledPromiseRejectionWarning被抛出
  • 肯定有一些时髦的东西,这些承诺的同步我必须是异步的
  • 只在最后或所有承诺中捕获错误?
  • 关闭客户端连接的承诺
node.js mongodb asynchronous
1个回答
0
投票

让我们列出一些代码段,

let dbInit =  function (){
dbConnected.then(
    (client) => {
        //////////////////////TASK 1/////////////////////
        let db = client.db('DB_NAME');
        db.dropDatabase()
            .then( () => {})
            .catch( err => { throw err;})
        return client;
       //////////////////////TASK 1/////////////////////
    }
)
.then(
    (client) =>{
        //////////////////////TASK 2/////////////////////
        let db = client.db('knodels');
        db.collection('Users').insertMany([
            //data
        ])
        .then( () => {})
        .catch( err => { throw err;})
        return client;
        //////////////////////TASK 2/////////////////////
   }
)
.then(
    (client) =>{            
        client.close();
    }
)
.catch((err) => {throw err;})
}

在承诺链中,与上面的那个一样,一旦前一个被解析,A块就会执行。这意味着包含TASK 2的then块只会在TASK 1完成后执行。

但是因为你没有从TASK 1返回一个承诺,而是返回一个真值(变量客户端),因为truthy值被视为promise promise。甚至在丢弃完成之前,它可能/可能开始执行db.collection('Users').insertMany...

类似的事情将适用于下一个块,其中将在插入完成之前调用client.close。

因此,不是在任何地方返回客户端,而是返回db操作,它是一个承诺,这将使链序列化。

此外,你不需要这样的嵌套链,每个承诺都有捕获,有点像

let connection = null;
dbConnected.then((client) => {
  connection = client;  
  const db = client.db('DB_NAME');
  return db.dropDatabase()
}).then(() => {
  // Perform insert and return a promise//
}).then(() => {
  return connection.close();
}).catch((err) => {
   // handle error //
})

应该做的工作!!

© www.soinside.com 2019 - 2024. All rights reserved.