首页 > 解决方案 > Axios 得到请求解析后,因此我的变量没有被分配

问题描述

在我的用户控制器上,我想发送一个获取请求以接收 json 响应。

当响应到来时,我想将值分配给调用嵌入的变量,但是渲染部分:

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

发生在轴功能完成之前...给我留下一个空对象。

我必须做什么才能等待响应......然后渲染模板?

请注意,控制台日志 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,
  });
};

标签: node.jsexpressasynchronousaxios

解决方案


请求是异步的。您需要再添加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,
  });
};

推荐阅读