sql >> Databáze >  >> NoSQL >> MongoDB

Správné zpracování asynchronních akcí Mongo v Node Promise

Protože všechny asynchronní operace ovladače MongoDB již vracejí příslib, neměli byste používat new Promise vůbec, ale nastavte řetězec slibů:

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

Chápu, že chcete předat database jako argument pro další then , ale narazíte na problém, že nebude k dispozici v catch psovod. Jedním z řešení je použití proměnné s rozsahem funkcí, která se přiřadí po otevření připojení, jako to dělá výše uvedený kód.

Pokud se vám to nelíbí, můžete vytvořit nový řetězec slibů uvnitř .then handler pro 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. C# - Generovat identitu jako ID s NoSQL (MongoDB)?

  2. Vložte pole do objektu v MongoDB

  3. Heroku:Úlohy na pozadí v Pythonu s RQ

  4. Vyvinout schéma databáze pro Notify jako facebook