Poiché tutte le operazioni asincrone del driver MongoDB restituiscono già una promessa, non dovresti usare new Promise
affatto, ma imposta una catena di promesse:
function updateDatabase(name, token) {
let database;
return MongoClient.connect(MONGODB_URL).then(db => {
database = db;
return database
.collection("testCollection")
.update({ name }, { $pull: { tokens: { $in: [token] } } });
})
.then(() => {
return database.collection("log").insert({
name,
token
});
})
.then(() => {
database.close(true);
})
.catch(err => {
database.close(true);
throw err;
});
}
Ho appreso che vuoi passare il database
come argomento per il prossimo then
, ma ti imbatterai nel problema che non sarà disponibile in catch
gestore. Una soluzione consiste nell'utilizzare una variabile con ambito funzione che viene assegnata dopo l'apertura della connessione, come fa il codice sopra.
Se non ti piace, puoi creare una nuova catena di promesse all'interno di .then
gestore per MongoClient.connect
:
function updateDatabase(name, token) {
return MongoClient.connect(MONGODB_URL).then(database => {
return database
.collection("testCollection")
.update({ name }, { $pull: { tokens: { $in: [token] } } })
.then(() => {
return database.collection("log").insert({
name,
token
});
})
.then(() => {
database.close(true);
})
.catch(err => {
database.close(true);
throw err;
});
});
}