2017-02-26 2 views
2

Hintergrund: Eine Market Sammlung hat eine url Eigenschaft, die ein Array von URLs von ausgewählten sites aus der Site Sammlung speichert. Ich erstellte einen Helfer (Code unten), den ich von /routes/markets.js anrufen konnte, das im Wesentlichen die Market basierend auf req.params.url auswählt und dann über das market.sites Array geht und die entsprechenden Site findet, speichert sie in einem Array, das ich verwenden kann, wenn die Ansicht gerendert wird.schieben kann nicht in ein Array von Mongoose dann Anweisung

Ausgabe: Aufruf der push Funktion auf dem Array tatsächlich nichts drücken und in der letzten console.log Anweisung Ich habe einfach protokolliert []

Frage: Wie kann ich in diesem Array schieben? Ist das ein Problem mit der for of Schleife und thenPromise Anruf?

markt helpers.js

exports.listSites = (req, res, errorRender, successRender) => { 
    let sites = []; 
    Market.find({url: req.params.url}) 
    .then((market) => { 
     for (url of market[0].sites) 
     Site.find({url}).then((site) => { 
      sites.push(site[0]); 
     }).catch((err) => console.log(err)); 

     console.log(sites); 
     res.render(successRender, {sites}); 
    }) 
    .catch((errors) => { 
     res.render(errorRender, {errors}); 
    }); 
}; 

Routen/markets.js

router.get('/:url', (req, res) => { 
    Markets.listSites(req, res, 'login-markets', 'markets/index'); 
}); 

Antwort

1

Site.find({url}) ist ein asynchroner operaration daher res.send vor warten auf das Ergebnis der Asynchron-Operation ausgeführt wird. Sie können Ergebnis aller asynchroner Operationen warten mit Promise.all und einmal alle von ihnen gelöst werden Sie die Antwort wie folgt zurückgeben:

exports.listSites = (req, res, errorRender, successRender) => { 
    let sites = []; 
    Market.find({url: req.params.url}) 
    .then((market) => { 
     const promises = []; 
     for (url of market[0].sites) 
      promises.push(Site.find({url}).then((site) => sites.push(site[0]))); 

     return Promise.all(promises).then(() => { 
      console.log(sites); 
      res.render(successRender, {sites}); 
     }); 
    }) 
    .catch((errors) => { 
     res.render(errorRender, {errors}); 
    }); 
}; 
+0

Das funktionierte perfekt! Vielen Dank! – szier

+0

Sie sind herzlich willkommen :) – cubbuk

Verwandte Themen