Проблема с Axios PUT и GET-запросом, иногда работает хорошо, иногда нет - PullRequest
0 голосов
/ 04 октября 2018

Я использую 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 голосов
/ 05 октября 2018

Это может быть длинным выстрелом без информации из вывода консоли и фактической информации или ошибок, возвращаемых из запросов GET, но я заметил много «этого» использования в вашем коде.

  1. Вы - двойные вложенные вызовы axios, которые являются асинхронными.«это» обычно трудно отладить в javascript, даже если вы используете функции стрелок, которые должны быть относительно безопасными.

Пожалуйста, попробуйте добавить:

let self = this;

Перед тем, как вы начнете свои GET-запросы, и используйте "self" вместо "this" в ваших обещаниях.

Это может быть очевидно, но я не вижу, чтобы вы вызывали this.submit () где-либо в вашем коде.Где внутри обратных вызовов GET вы вызываете SUBMIT для запроса PUT?
...