Запрос Mongoose внутри .then, получая предупреждения и ошибки, несмотря на работу - PullRequest
0 голосов
/ 09 июня 2018

Я немного растерялся после прочтения документации о том, могу ли я выполнить запрос мангуста в дескрипторе обещания.В этом случае я пытаюсь перебрать массив объектов в portfolio.coin, а затем посмотреть их текущие цены в другой модели.Есть лучший способ сделать это?Следующий код работает, но я получаю предупреждения Unhandledpromiserejection и документ notfound error.

// @route:       GET api/portfolio/
// @description: Get the latest portfolio with price changes
// @access:      Private
router.get('/', passport.authenticate('jwt',
  { session: false }), (req, res) => {
    Portfolio.findOne({
      user: req.user.id
    }).then(portfolio => {
      if (portfolio) {
        // Loop over all the coins in the portfolio
        portfolio.coin.forEach((item, index) => {

          // In scope object 
          let details = {
            _id: item._id,
            exchange: item.exchange,
            currencyname: item.currencyname,
            currencyquantity: item.currencyquantity,
            currencypaidwith: item.currencypaidwith,
            pricepaid: item.pricepaid,
            currentprice: 0,
            pricedifference: 0
          };

          // For each coin find the market prices
          Market.findOne({
            exchange: item.exchange,
            coin_one: item.currencyname,
            coin_two: item.currencypaidwith
          }).then(result => {
            if (result) {

              // details
              details.currentprice = result.price;
              details.pricedifference = result.price; // TODO: percentage 
              portfolio.coin[index] = details;

              if (portfolio.coin.length >= index) {
                portfolio.save().then(portfolio => res.json(portfolio)).catch(err => res.status(404).json({ nodoc: "somethin went wrong" }));
              }
            }
          }).catch(err => res.status(404).json({ nodoc: "could not find a doc" }))
        });
      }
    })
  })

1 Ответ

0 голосов
/ 09 июня 2018

вам нужно добавить .catch в последнюю строку

// @route:       GET api/portfolio/
// @description: Get the latest portfolio with price changes
// @access:      Private
router.get('/', passport.authenticate('jwt',
{ session: false }), (req, res) => {
    Portfolio.findOne({
    user: req.user.id
    }).then(portfolio => {
    if (portfolio) {
        // Loop over all the coins in the portfolio
        portfolio.coin.forEach((item, index) => {

        // In scope object 
        let details = {
            _id: item._id,
            exchange: item.exchange,
            currencyname: item.currencyname,
            currencyquantity: item.currencyquantity,
            currencypaidwith: item.currencypaidwith,
            pricepaid: item.pricepaid,
            currentprice: 0,
            pricedifference: 0
        };

        // For each coin find the market prices
        Market.findOne({
            exchange: item.exchange,
            coin_one: item.currencyname,
            coin_two: item.currencypaidwith
        }).then(result => {
            if (result) {

            // details
            details.currentprice = result.price;
            details.pricedifference = result.price; // TODO: percentage 
            portfolio.coin[index] = details;

            if (portfolio.coin.length >= index) {
                portfolio.save().then(portfolio => res.json(portfolio)).catch(err => res.status(404).json({ nodoc: "somethin went wrong" }));
            }
            }
        }).catch(err => res.status(404).json({ nodoc: "could not find a doc" }))
        });
    }
    }).catch(err => res.status(404).json({ nodoc: "could not find a portfolio" }))
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...