Axios получает разрешение запроса после, поэтому моя переменная не назначается - PullRequest
0 голосов
/ 17 февраля 2019

На моем пользовательском контроллере я хочу отправить запрос на получение ответа json.

Когда приходит ответ, я хочу присвоить значение переменной embed, но часть рендеринга:

  res.render('user', {
    user,
    title: user.name,
    embed: embed.html,
  });

Происходит до завершения функции оси ... оставляя меня с пустым объектом.

Что мне нужно сделать, чтобы дождаться ответа ... и затем отобразитьtemplate?

Обратите внимание, что журнал консоли 2 происходит перед журналом консоли 1 в этом коде:

exports.getUserBySlug = async (req, res, next) => {

  const user = await User.findOne({ slug: req.params.slug })
  let embed = {}
  if (!user) return next();

  axios.get(`https://soundcloud.com/oembed?format=json&url=${user.musicLink}`)
  .then(response => {
    embed = response.data
  console.log('1: ', embed)

  })
  .catch(error => {
    console.log(error);
  })

  console.log('2: ', embed)

  res.render('user', {
    user,
    title: user.name,
    embed: embed.html,
  });
};

1 Ответ

0 голосов
/ 17 февраля 2019

Запрос асинхронный.Вам нужно добавить один await больше

exports.getUserBySlug = async (req, res, next) => {

  const user = await User.findOne({ slug: req.params.slug })
  let embed = {}
  if (!user) return next();

  await axios.get(`https://soundcloud.com/oembed?format=json&url=${user.musicLink}`)
  .then(response => {
    embed = response.data
  console.log('1: ', embed)

  })
  .catch(error => {
    console.log(error);
  })

  console.log('2: ', embed)

  res.render('user', {
    user,
    title: user.name,
    embed: embed.html,
  });
};

Также я бы рекомендовал НЕ смешивать async/await с .then вызовами.

exports.getUserBySlug = async (req, res, next) => {

  const user = await User.findOne({ slug: req.params.slug })
  let embed = {}
  if (!user) return next();

  try {
    const response = await axios.get(`https://soundcloud.com/oembed?format=json&url=${user.musicLink}`)
    embed = response.data
  } catch (e) {
    console.error(e)
  }

  res.render('user', {
    user,
    title: user.name,
    embed: embed.html,
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...