我是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;})
}
我想实现这些目标:
当我运行该函数时,所有这些目标都实现了,但我认为代码有问题:
dbInit()
运行时,一些UnhandledPromiseRejectionWarning
被抛出让我们列出一些代码段,
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 //
})
应该做的工作!!