Axios PUT和GET请求出现问题,有时效果不错,有时效果不佳

时间:2018-10-04 20:43:17

标签: javascript vue.js axios vue-cli

我正在使用Axios从服务器获取数据,我正在尝试执行PUT请求,我需要从3个表中获取数据信息以填写表格,当我执行PUT时,它有时可以工作并且有时不能,但是当我打开浏览器终端调试问题时,PUT请求始终有效,而且我注意到没有嵌套GET请求的另一个组件始终可以正常工作,但是如果那些组件不能从服务器获取数据, GET请求没有嵌套。

这是我的脚本代码,我不知道我在做什么错事。

  <template>
  <div class="container-fluid">
    <div style="margin:40px;background-color:rgba(255, 255, 255, 0.7);">
      <div class="row">
        <nav aria-label="breadcrumb">
          <ol class="breadcrumb">
            <li class="breadcrumb-item"><a href="/">Home</a></li>
            <li class="breadcrumb-item"><a href="/usuarios">Usuarios</a></li>
            <li class="breadcrumb-item"><a href="/roles">Roles</a></li>
            <li class="breadcrumb-item"><a v-bind:href="rol_url">{{rol_name}}</a></li>
            <li class="breadcrumb-item active" aria-current="page">Editar Rol</li>
          </ol>
        </nav>
      </div>
      <div class="row">
        <div class="col-md-8 offset-md-2" style="margin-bottom:80px;">
          <div class="row">
            <div class="col">
              <button onclick="window.history.back();" class="btn btn-primary" style="background:#003e1e;border-color:#003e1e;">
                <font-awesome-icon icon="arrow-left" size="lg"></font-awesome-icon>
              </button>
            </div>
          </div>
          <div>&nbsp;</div>
          <div class="row justify-content-center">
            <div class="col-5 align-self-center">
              <form>
                <div class="form-group">
                  <label for="rolName">Nombre del rol:</label>
                  <input v-model="rol_name" type="text" class="form-control" id="rolName" aria-describedby="rolName" placeholder="Nombre">
                </div>
                <div class="form-group">
                  <label for="rolModules">Modulos del rol:</label>
                  <multiselect v-model="rol_mod" :options="modules" :multiple="true" :close-on-select="true" :clear-on-select="false" :hide-selected="true" :preserve-search="true" placeholder="Seleccione los modulos" label="name" track-by="modulo" :preselect-first="false">
                  </multiselect>
                </div>
                <div v-for='(module, index) in rol_mod' :key='index' class="form-group">
                  <label for="rolModules">Permisos de {{module.name}}</label>
                  <multiselect v-model="module.permisos" :options="permits" :multiple="true" :close-on-select="true" :clear-on-select="false" :hide-selected="true" :preserve-search="true" placeholder="Seleccione los permisos del modulo" label="name" track-by="_id" :preselect-first="false">
                  </multiselect>
                </div>
                <div class="form-group">
                  <label for="rolStates">Estado del rol:</label>
                  <multiselect v-model="rol_state" :options="states" track-by="name" label="name" :searchable="false" :close-on-select="true" :show-labels="true" :placeholder="rol_state_get">
                  </multiselect>
                </div>
                <div class="form-group">
                  <label for="permitDescription">Descripción:</label>
                  <textarea v-model="rol_description" class="form-control" aria-label="permitDescription"
                  placeholder="Descripción" :rows="6" :max-rows="10"></textarea>
                </div>
                <div>&nbsp;</div>
                <div class="row justify-content-center">
                  <div class="col-4 text-center">
                    <button class="btn btn-primary" v-on:click="submit()" style="background:#003e1e;border-color:#003e1e;">
                      <font-awesome-icon icon="save" size="lg"></font-awesome-icon>
                      Guardar
                    </button>
                  </div>
                  <div class="col-4 text-center">
                    <a class="btn btn-primary" style="background:#003e1e;border-color:#003e1e;" v-bind:href="rol_url">
                      <font-awesome-icon icon="times-circle" size="lg"></font-awesome-icon>
                      Cancelar
                    </a>
                  </div>
                </div>
                <div>&nbsp;</div>
              </form>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import Multiselect from 'vue-multiselect'
const axios = require('axios');
var API_IP = process.env.VUE_APP_API_IP

export default {
  components: {
    Multiselect
  },
  data () {
    return {
      rol_auditoria: {},
      modules: [],
      permits: [],
      rol_name: "",
      rol_state: "",
      rol_state_get: "",
      rol_description: '',
      states: [
        { name: "Activo", activo: "true" },
        { name: "Inactivo", activo: "false" }
      ],
      rol_mod: [],
      rol_url: ""
    }
  },
  mounted () {
    axios
    .get(API_IP+'/rol/'+this.$route.params.id)
    .then(response => {
      this.rol_auditoria = response.data.data.auditoria;
      this.rol_name = response.data.data.nombre;
      this.rol_state = response.data.data.activo;
      response.data.data.activo? this.rol_state_get="Activo" : this.rol_state_get="Inactivo";
      this.rol_description = response.data.data.descripcion
      this.rol_id = response.data.data._id
      this.rol_url = "/roles/"+response.data.data._id

      for (var k in response.data.data.modulos){
        var mod_info = {}
        console.log(response.data.data.modulos[k].modulo.nombre);
        mod_info["_id"] = response.data.data.modulos[k]._id
        mod_info["modulo"] = { "_id" : response.data.data.modulos[k].modulo._id }
        mod_info["name"] = response.data.data.modulos[k].modulo.nombre
        var mod_per = []
        for (var j in response.data.data.modulos[k].permisos){
          var perms = {}
          perms["_id"] = response.data.data.modulos[k].permisos[j]._id
          perms["name"] = response.data.data.modulos[k].permisos[j].nombre
          mod_per.push(perms)
        }
        mod_info["permisos"] = mod_per
        this.rol_mod.push(mod_info)
      }

      axios
      .get(API_IP+"/module/")
      .then(response => {
        for(var k in response.data.data){
          var mod = {}
          mod["modulo"] = { "_id" : response.data.data[k]._id }
          mod["name"] = response.data.data[k].nombre;
          this.modules.push(mod);
        }
        axios
        .get(API_IP+"/permit/")
        .then(response => {
          for(var k in response.data.data){
            var per = {}
            per["name"] = response.data.data[k].nombre;
            per["_id"] = response.data.data[k]._id;
            this.permits.push(per);
          }
        });
      });

    })

  },
  methods: {
    submit: function() {
      axios
      .put(API_IP+"/rol/"+this.$route.params.id, {
        auditoria: this.rol_auditoria,
        activo: this.rol_state.activo,
        _id: this.rol_id,
        nombre: this.rol_name,
        descripcion: this.rol_description,
        modulos: this.rol_mod
      })
      .then(function (response) {
        console.log(response);
      })
      .catch(function (error) {
        console.log(error);
      });
      this.$router.push({ name: 'showrol', params: { id: this.rol_id} });
    }
  }
}

</script>

1 个答案:

答案 0 :(得分:1)

这可能是一个长途跋涉,没有控制台输出的信息以及GET请求返回的实际信息或错误,但是我注意到您的代码上有很多“ this”用法。

  1. 您正在异步嵌套axios调用。即使您使用应该比较安全的箭头功能,“ this”也往往很难在javascript中进行调试。

请尝试添加:

let self = this;

在开始GET请求之前,并在诺言中使用“自我”而不是“此”。

  1. 这可能很明显,但是我看不到您在代码中的任何地方调用this.submit()。您在GET回调中的哪个位置调用SUBMIT进行PUT请求?
相关问题