当前位置: 首页 > 知识库问答 >
问题:

身份验证Vuex Axios错误的url请求状态404

南宫俊逸
2023-03-14

我试图用我正在使用的API进行身份验证,但是当我试图登录时,我收到了这样的响应:加载资源失败:服务器响应状态为404(未找到)[http://localhost:8080/localhost: 5000/api/登录]

我认为问题出在axios上,因为它使用我的本地Vue应用程序地址apiAdress来执行请求。

主要的js:

import axios from 'axios'
Vue.use(axios)
axios.defaults.baseURL = process.env.VUE_APP_API; //(http://localhost:5000/api

模块/身份验证。js:

import { AUTH_REQUEST, AUTH_ERROR, AUTH_SUCCESS, AUTH_LOGOUT } from '../actions/auth'
import { USER_REQUEST } from '../actions/user'
import axios from 'axios'

const state = { token: localStorage.getItem('user-token') || '', status: '', hasLoadedOnce: false }

const getters = {
  isAuthenticated: state => !!state.token,
  authStatus: state => state.status,
}

const actions = {
  [AUTH_REQUEST]: ({commit, dispatch}, user) => {
    return new Promise((resolve, reject) => {
     commit(AUTH_REQUEST)
  axios({url: '/login', data: user, method: 'POST'})
  .then(resp => {
    localStorage.setItem('user-token', resp.token)
    // Here set the header of your ajax library to the token value.
    axios.defaults.headers.common['Authorization'] = resp.token
    commit(AUTH_SUCCESS, resp)
    dispatch(USER_REQUEST)
    resolve(resp)
  })
  .catch(err => {
    commit(AUTH_ERROR, err)
    localStorage.removeItem('user-token')
    reject(err)
  })
})
},
}

const mutations = {
  [AUTH_REQUEST]: (state) => {
  state.status = 'loading'
  },
  [AUTH_SUCCESS]: (state, resp) => {
    state.status = 'success'
    state.token = resp.token
    state.hasLoadedOnce = true
  },
  [AUTH_ERROR]: (state) => {
  state.status = 'error'
  state.hasLoadedOnce = true
  },
  [AUTH_LOGOUT]: (state) => {
    state.token = ''
  }
}

export default {
 state,
 getters,
 actions,
 mutations,
}

login.vue:

  methods: {
    login() {
      const { username, password } = this
      this.$store.dispatch(AUTH_REQUEST, { username, password }).then(() => {
      this.$router.push('/')
   })
    },

共有1个答案

伍玮
2023-03-14

您根本不需要在main中定义axios。

此外,axios不是vue插件,因此vue。使用(axios)执行任何操作。

以你的名义。您可以创建一个实例

const axios = require('axios');

const axiosInstance = axios.create({
  baseURL: process.env.VUE_APP_API
});

在您的操作中,使用axios实例而不是axios

const actions = {
  [AUTH_REQUEST]: ({commit, dispatch}, user) => {
    return new Promise((resolve, reject) => {
     commit(AUTH_REQUEST)
  axiosInstance({url: '/login', data: user, method: 'POST'})
  .then(resp => {
    localStorage.setItem('user-token', resp.token)
    // Here set the header of your ajax library to the token value.
    axios.defaults.headers.common['Authorization'] = resp.token
    commit(AUTH_SUCCESS, resp)
    dispatch(USER_REQUEST)
    resolve(resp)
  })
  .catch(err => {
    commit(AUTH_ERROR, err)
    localStorage.removeItem('user-token')
    reject(err)
  })
})

但是,这可能会导致在创建实例后更新标头时出现问题,因此您可能需要使用一些巧妙的方法来解决这一问题。

一种方法是使用函数,而不是值,这样无论何时进行调用,它都会使用本地存储中的数据

const axiosInstance = axios.create({
  baseURL: process.env.VUE_APP_API,
  headers: {
    Authorization: {
      toString () {
        return `Bearer ${localStorage.getItem('user-token')}`
      }
    }
  }
})

另一种方法是每次打电话时创建一个新请求

const actions = {
  [AUTH_REQUEST]: ({ commit, dispatch }, user) => {
    return new Promise((resolve, reject) => {
      const axiosInstance = axios.create({
        baseURL: process.env.VUE_APP_API
      });
      commit(AUTH_REQUEST)
      axiosInstance({
          url: '/login',
          data: user,
          method: 'POST'
        })
        .then(resp => {
          localStorage.setItem('user-token', resp.token)
          // Here set the header of your ajax library to the token value.
          axios.defaults.headers.common['Authorization'] = resp.token
          commit(AUTH_SUCCESS, resp)
          dispatch(USER_REQUEST)
          resolve(resp)
        })
        .catch(err => {
          commit(AUTH_ERROR, err)
          localStorage.removeItem('user-token')
          reject(err)
        })
    })
  },
  [SECURE_REQUEST]: ({ commit, dispatch }, user) => {
    return new Promise((resolve, reject) => {
      const axiosInstance = axios.create({
        baseURL: process.env.VUE_APP_API,
        headers: {
          'Authorization': 'Bearer ' + localStorage.getItem('user-token')
        }
      });
      commit(SECURE_REQUEST)
      axiosInstance({
          url: '/getData',
          data: user,
          method: 'POST'
        })
        // ...
    })
  },
}

另一个选项(我现在使用的)是使用devServer。代理config。但这需要使用Vue-Cli-3。它还假设最终的静态捆绑包将与API运行在同一台服务器上,这可能不适合您。

此外,请查看此解决方案:https://github.com/axios/axios/issues/1383#issuecomment-405900504

 类似资料:
  • 我正在尝试使用api访问我的google analytics帐户中的用户。但是我越来越 “错误:{“代码”:403,“消息”:“请求的身份验证范围不足。”,“错误”:[{“消息”:“权限不足”,“域”:“全局”,“原因”:“权限不足”}],“状态”:“权限被拒绝”}此错误。这是我的php代码。 我如何解决这个问题?

  • 我得到了一个使用fcm发送通知的应用程序,当我通过控制台发送消息时一切正常,但是当我尝试通过php(curl-post)或postman(firefox扩展)发送消息时,我得到了一个身份验证错误(甚至使用了密钥) 字符串(304)“{”错误:{”代码:401,“消息”:“请求缺少所需的身份验证凭据。应为OAuth 2访问令牌、登录cookie或其他有效身份验证凭据。请参阅https://devel

  • 我试图得到一个API查询到python。命令行 给出一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python中调用它,这样我就可以循环使用不同的ID并分析输出。有什么想法吗?在需要身份验证之前,我已经使用urllib2完成了这项工作。我还查看了requests模块,但不知道如何实现。 非常感谢。

  • 但是这个配置的问题是我只能以用户Euclid的身份登录。但我想作为每一个可用的用户登录。 但是对于另一个配置,我会在日志中得到这样的消息,即找到了该用户,但已经发生了驱逐。 2017-04-20 09:36:16]ldap_driver.debug:ldap_search(dc=example,dc=com,(&(&(objectclass=person))(UID=einstein)),[arr

  • 我想在CDH-5.3.2版本中使用水槽从twitter获取数据。我已经配置了flume.conf、hbase接收器和twitter源代码。 但是,当我启动代理时,我收到以下错误: flume.conf和hbase接收器代码与此博客相同:http://ahikmat.blogspot.com/2014/08/streaming-twitter-tweets-to-hbase-with.html 而且

  • 在controller文件夹中,我有一个名为fbauth.php的控制器,其中有以下代码 但当我点击facebook链接并尝试连接时,我得到了如下错误 另外,为了进行双重检查,我在Kohana之外创建了这个函数,它没有问题。 我所做的是,在Kohana的外部,我创建了一个名为index.php的文件,在其中我输入了html和Facebook身份验证的标记,然后我创建了一个名为testauth.ph