【问题标题】:asyncData get profile from dbasyncData 从 db 获取配置文件
【发布时间】:2021-02-04 15:51:00
【问题描述】:

所以我想使用 asyncdata 和 axios 从 db 获取,这是代码,问题是没有发送请求,我想知道是否有人可以帮我捕捉错误。

async asyncData({ $axios, store }) {
    try {
      let profile = await $axios.$get('/profile', store.state.auth.id)
      
      return { profile }
    } catch (error) {
      console.log(error.message)
    }
  },
router.get('/profile', async (req, res) => {
  const { userId } = req.body

  try {
    const profileUser = await User.findById(userId)

    res.send(profileUser)
  } catch (e) {
    console.log(e)
    res.status(400).json(e.message)
  }
})

【问题讨论】:

  • 你正在执行 $get.. req.body 不会被设置,也不会包含userId
  • 我删除了 $ 但还是,还有其他语法错误吗?
  • 任何类型的身份验证都应该在标头中完成,并在到达路由处理程序 router.get('/profile', authProtected, function(...` 等) 之前由中间件处理然后用 id 填充req.user,然后你可以对不属于自己的配置文件执行await User.findById(req.user.id)..,然后它将作为参数传递,即/profile/:id,然后你将使用req.params.id(你可以抽象函数因此,如果您不想重复代码,它可以使用参数处理或默认拥有)。
  • , store.state.auth.id) 看起来不对,请查看有关如何设置标头和设置不记名令牌等的文档,以及您是否为用户使用会话。应该是req.session.user.id

标签: mongodb express vue.js mongoose nuxt.js


【解决方案1】:

如果您想将 id 作为参数传递,您可能需要将路由修改为以下内容

router.get('/profile/:id', async (req, res) => {
  const { userId } = req.params.id;

  try {
    const profileUser = await User.findById(userId)

    res.send(profileUser)
  } catch (e) {
    console.log(e)
    res.status(400).json(e.message)
  }
})

并添加配置文件ID作为路由参数

async asyncData({ $axios, store }) {
    try {
      let profile = await $axios.get('/profile/{profile_id_here}')
      
      return { profile }
    } catch (error) {
      console.log(error.message)
    }
  }

否则,如果您想获取经过身份验证的用户的 id(可以从 Bearer 令牌中解析),则需要在您的身份验证中间件中将其设置为 request 对象。

在您的身份验证中间件中,

const user = await _authService.validateFromToken(bearerToken);
 if (user) {
      req.user = user;
  }

然后您可以访问经过身份验证的用户,

router.get('/profile', async (req, res) => {
  const { userId } = req.user._id;

  try {
    const profileUser = await User.findById(userId)

    res.send(profileUser)
  } catch (e) {
    console.log(e)
    res.status(400).json(e.message)
  }
})

【讨论】:

  • 可能需要调整const { userId } = req.params.id;
  • @LawrenceCherone 我已经用一个例子修改了答案。假设您的意思是从请求对象而不是路由参数获取用户 ID。如果我的理解有误,请纠正我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2015-02-09
  • 2023-03-14
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多