Как добавить поле из вытянутого документа mongodb - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь использовать API для получения текущей стоимости акции и умножения на акции пользователей.

Когда я звоню по маршруту, я получаю пустые данные, и когда я печатаю значениеПри обратном вызове я получаю пустой массив

 function user_cur_portfolio(port, callback) {
  let portfolio = [];
  port.forEach( (stock) => {
    var ticker = stock.name.toLowerCase();
    alpha.data.quote(`${ticker}`).then(data => {
      var fixed = Number((data['Global Quote']['05. price'] * stock.shares).toFixed(2));
      let curr = {
        name : ticker,
        shares: stock.shares,
        value : fixed
      }
      portfolio.push(curr)
    });
  })
  callback(portfolio)
}
router.get('/portfolio', (req, res, next) => {
  if (req.session.userId !== undefined){

     User.findOne({ _id : req.session.userId }).exec(function (err, user) {
      if (err)
        next(err);

        user_cur_portfolio(user.portfolio, (port)=>{
          console.log(port);

          res.render('portfolio', { portfolio: port, balance: user.balance});
        });    
    })
  } else { 
    res.redirect('/users/login');
  }
});

1 Ответ

1 голос
/ 04 октября 2019

Когда я звоню по маршруту, я получаю пустые данные Поскольку alpha.data.quote - это асинхронная функция, а forEach - это функция синхронизации, поэтому вы не получите data в portпеременная.

Так что лучший способ обойти это, это использовать async await со всеми синхронными функциями, чтобы вести их как async

async function user_cur_portfolio(port) {
  let portfolio = [];
  await Promise.all(
    port.map(async stock => {
      var ticker = stock.name.toLowerCase();
      const data = await alpha.data.quote(`${ticker}`);
      var fixed = Number((data['Global Quote']['05. price'] * stock.shares).toFixed(2));
      let curr = {
        name: ticker,
        shares: stock.shares,
        value: fixed
      };
      portfolio.push(curr);
    })
  );
  return portfolio;
}

router.get('/portfolio', (req, res, next) => {
  if (req.session.userId !== undefined) {
    User.findOne({ _id: req.session.userId }).exec(async function(err, user) {
      if (err) next(err);
      const port = await user_cur_portfolio(user.portfolio);
      console.log(port);
      res.render('portfolio', { portfolio: port, balance: user.balance });
    });
  } else {
    res.redirect('/users/login');
  }
});
...