Сервер ExpressJs получает пустой объект запроса от VueJS по запросу на удаление, используя axios, но Почтальон работает - PullRequest
1 голос
/ 24 сентября 2019

Я использую ExpressJS с Postgres / Knex / Objection и VueJS на внешнем интерфейсе.У меня есть пользователи, группы и членство. St Таблица членства связывает пользователей и группы.

Я пытаюсь удалить членство из vue, отправив groups_id и users_id на экспресс-маршрут.

Все работает в Почтальоне, но req.body пусто на экспресс-стороне.

На стороне Vue вот мой метод Vue delete:

async deleteMembership() {
  await MembershipsService.deleteMembership({
    membership: {
      groupId: this.group.id,
      userId: this.$store.getters.user.id
    }
  });
  this.$emit("membership-deleted");
  console.log('membership has been deleted');
}

вот мойMembershipsService:

import Api from '@/services/Api'

export default {
  fetchMemberships () {
    return Api().get('memberships')
  },

  ...

  deleteMembership (params) {
    console.log('these are the request params: ', params);
    return Api().delete('memberships/', params)
  }
}

Вот маршрут со стороны экспресса:

router.delete('/', async (req, res) => {
  // deletes a membership
  console.log('this is the req: ', req);
  await Membership
    .query()
    .delete()
    .where('users_id', '=', req.body.membership.userId )
    .andWhere('groups_id', '=', req.body.membership.groupId )
  res.json({
    success: true, message: 'membership deleted' 
  });
});

Это тело работающего почтальона с просьбой удалить до http://localhost:8000/api/memberships:

{
    "membership":
    { 
        "userId": 8,
        "groupId": 1 
    }
}

Вот тело нерабочего запроса на Vue.js:

these are the request params:  {membership: {…}}membership: groupId: 1userId: 8__proto__: Object__proto__: Object

Это ошибка на стороне Express:

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'userId' of undefined

Это req.body объект в экспрессе:

body: {}

1 Ответ

0 голосов
/ 24 сентября 2019

Axios * Второй аргумент .delete() - это объект config. ( Определение типа TypeScript здесь. ) Если вы хотите передать тело, вы можете использовать data опция конфигурации :

axios.delete('https://some.url/resource', {data: {foo: 'bar': baz: 123}})

В вашем случае (предположим, Api() возвращает экземпляр axios):

deleteMembership (params) {
  console.log('these are the request params: ', params);
  return Api().delete('memberships/', {data: params})
}

Демонстрация:

axios.delete('https://reqres.in/api/users/2', {
  data: {
    foo: 'bar'
  }
}).then(function(response) {
  console.log(response);
});
<script src="https://unpkg.com/axios@0.19.0/dist/axios.min.js"></script>

Use the developer tools 'Network' tab to inspect the call and see the payload is sent.
...