Параметры Axios POST на сервере пустые - используется стек MERN - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу обновить документ в Mongo, но когда я отправляю POS-запрос Axios на сервер с параметрами для обновлений, я получаю только пустой объект на стороне сервера - я использую Node.js с Expressсервер (стек MERN).

Я пробовал библиотечный модуль qs и модуль Node's querystring.Я попытался включить заголовки с 'Content-Type': 'application/x-www-form-urlencoded' и 'application/json'.

Мой POST-запрос Axios:

const A = 1;
const B = 2;
const data = { A, B };
console.log(qs.stringify(data));                 // A=1&B=2
axios.post(url('upVote'), qs.stringify(data));

Маршрут сервера:

app.post('/upVote', async (req, res) => {
  console.log(req.params);                       // {}
  await DB.updateVote(ID, collection, voteCount);
  res.end();
});

заголовки, как показано в Chrome DevTools .

... Кроме того, все мои axios.get() запросы работают нормально, получают данные из Mongo и отправляют их обратно в мое приложение должным образом, а URL / конечные точки совпадают.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Существует несколько способов отправки данных на сервер с помощью axios.Я вижу путаницу с документацией в axios, я не видел этого использования раньше, и он, похоже, не работает при просмотре журналов запросов и объекта.

1) axios.postполучает тело запроса в качестве второго параметра.Поэтому, если вы хотите передать параметры в axios, вы должны сделать что-то вроде этого:

const B = 2;
const data = { A: 1, B: 1 };

axios.post(url('upVote'), {}, { params: data });

Обратите внимание, что axios будет самостоятельно обрабатывать строковое преобразование, а третий параметр - объект конфигурации .

На сервере параметры будут доступны по адресу request.query

2) Если вы хотите сами настроить параметры, то вы должны добавить их в свой URL, например,

axios.post(`url('upVote')?${qs.stringify(data)}`);

То же самое здесь, данные на сервере будут находиться под request.query

3) Как правило, лучше использовать тело почтового запроса для передачи полезных данных большого объема для удобства.Вам также следует подумать о том, каковы ваши стратегии кэширования, и если они основаны на URL-адресе запроса без учета тела запроса, это может вызывать беспокойство.

axios.post(url('upVote'), data);

В этом случае данные на сервере будут находиться под request.body

UPD: изначально забыл упомянуть, что вам понадобится промежуточное программное обеспечение body-parser для доступа request.body.

4) Вы можете использовать axios без сокращений методов, которые могут быть полезны для некоторых людей

axios({
  method: 'POST',
  url: url('upVote'),
  params: data
})

Это идентично примеру 1. 1. 1035 * И все они возвращают Обещание, которое вы можете .then().catch() или await.

0 голосов
/ 25 сентября 2018

Я думаю, что вы звоните res.end().Я думаю, что это должно быть res.send(...)

Этот ответ должен помочь: https://stackoverflow.com/a/29555444/1971378

0 голосов
/ 25 сентября 2018

Я думаю, что вы хотите .body вместо .params. Поскольку вы отправляете данные в теле по почте, используя axios.Вы печатаете параметры, которые ничего не будут печатать для этого URL / API.Попробуйте

console.log(req.body) // instead of req.params 

Если это не помогло, пожалуйста, покажите нам свой код реакции.Более того, в реакции вы должны добавить .then() после axios, иначе будет написано неоплаченное обещание

Чтобы получить параметры на стороне сервера, вы должны внести некоторые измененияВ axios ( реагирует )

axios.post(url('upVote/param'), qs.stringify(data));

На сервере

app.post('/upVote/:params', async (req, res) => {
 console.log(req.params)
 .....
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...