You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue调用Okta的$auth.getAccessToken时报错then不是函数如何解决?

问题原因解析

报错和this作用域无关

你在getUser的then回调中使用的是箭头函数,箭头函数不会创建独立的this上下文,会直接继承外层作用域的this指向,你代码中前面的this.$store.commit可以正常执行,已经证明this指向的Vue实例是完全正确的,报错和this作用域没有任何关系。

报错的核心原因

你使用的Okta Vue SDK版本中,getAccessToken()是同步方法,它会直接返回访问令牌字符串或者undefined,不会返回Promise对象。只有Promise对象才拥有.then方法,你对非Promise类型的返回值调用.then,自然会触发该类型错误。
而getUser()确实是异步方法,会返回Promise,所以可以正常调用.then。

为什么粘贴同步代码后可以正常运行

你补充的那段代码没有调用.then,是直接同步接收getAccessToken()的返回值,完全匹配该方法的行为,所以可以正常运行。

额外代码优化建议

你原来的用户判断逻辑存在错误:if (user == null && user == undefined),null和undefined不可能同时成立,可以直接简化为if (!user),即可覆盖null、undefined两种空值情况。

修正后的代码示例

created() {
    this.$store.commit('SET_LOADING_APP', true)

    this.$auth.getUser().then((user) => {
      // Set Okta user
      if (!user) {
        // no user
        this.$store.commit(
          'SET_RESPONSE_MSG',
          'Okta user is null or undefined.'
        )
        this.$store.commit('SET_RESPONSE_TYPE', 'error')
      } else {
        // store user
        this.$store.commit('SET_OKTA_USER', user)

        // 直接同步获取token,无需调用.then
        const token = this.$auth.getAccessToken()
        if (token) {
          this.$store.commit('SET_ACCESS_TOKEN', token)
          localStorage.setItem('token', JSON.stringify(token))
          apiClient.defaults.headers.common.Authorization = `Bearer ${token}`
        }
        
        // adName
        const adName = user.preferred_username.substr(
          0,
          user.preferred_username.indexOf('@')
        )
        this.$store.commit('SET_AD_NAME', adName)
        this.getUserInfo(adName)
      }
    })
  },

内容的提问来源于stack exchange,提问作者Eric Brown - Cal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:27:02