MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Prawidłowa obsługa asynchronicznych akcji Mongo w Node Promise

Ponieważ wszystkie asynchroniczne operacje sterownika MongoDB zwracają już obietnicę, nie należy używać new Promise w ogóle, ale stwórz łańcuch obietnic:

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;
  });
}

Rozumiem, że chcesz przekazać database jako argument dla następnego then , ale napotkasz problem polegający na tym, że nie będzie on dostępny w catch treser. Jednym z rozwiązań jest użycie zmiennej o zakresie funkcji, która zostaje przypisana po otwarciu połączenia, tak jak robi to powyższy kod.

Jeśli ci się to nie podoba, możesz utworzyć nowy łańcuch obietnic wewnątrz .then handler dla 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;
      });
  });
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Agregacja w kolbie-mongoengine

  2. Meteor.Collection.ObjectID() a MongoDB ObjectId()

  3. Zaktualizuj pole w dokładnej tablicy elementów w MongoDB

  4. mongodb - Skonstruuj DBRef za pomocą łańcucha lub ObjectId

  5. Jak monitorować MongoDB za pomocą Prometheus i ClusterControl