React.js Использование axios для отправки целочисленных данных, но получение [объекта объекта] в Node.js - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь отправить целое число на сервер, чтобы выполнить некоторые вычисления, используя axios в React.Однако в бэкэнде я получил [object object].Я попытался увидеть, что находится в объекте, выполнив console.log(Object.getOwnPropertyNames(req.body)), и он возвращает пустой объект

Я также использую парсер тела.Мой другой маршрут использует axios для отправки данных (объекта), он работал нормально.Разве целое число не считается чистым целым числом в body.parse?

const express = require('express');
const app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());


app.post('/buy', (req, res) => {
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("wallet");
    var myquery = { amount: {$gt: 0} }
    console.log("New Amount:" + req.body)
    console.log(Object.getOwnPropertyNames(req.body))
    var newquery = { $set: {amount: req.body}}
    /*dbo.collection("account").updateOne(myquery, newquery, function(err, re) {
      if (err) throw err;
      console.log("Wallet updated")
      db.close();
    });*/
  });
});

Моя реакция:

handleSubmit(e){
    e.preventDefault()
    var remain = this.state.wallet - this.state.total
    console.log(remain)

    axios({ method: 'post', url: '/buy', data: remain})
}

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Обычно также числа, логические, строковые и нулевые, без какого-либо объекта или массива, являются допустимыми json.Но axios не обрабатывает их как JSON по умолчанию в процессе автоопределения, только те, у которых typeof равен object, будут отправлены с типом контента application/json.

. Вам потребуетсячтобы установить заголовок content-type самостоятельно:

axios({ method: 'post', url: '/buy', data: 1, headers: {
  'Content-Type': 'application/json; charset=utf-8'
}})

Теперь axios будет отправлять с "правильным" заголовком типа контента, чтобы получатель воспринял его как JSON.

Но теперь body-parser будет жаловаться на то, что полученные данные не соответствуют действительности.Это связано со следующей опцией:

строгий
При значении true будут приниматься только массивы и объекты;когда false примет все, что JSON.parse примет.По умолчанию true.

Ваш код будет работать с использованием опции strict: false для body-parser в сочетании с настройками заголовка Content-Type для axios.

Такможно заставить его работать, но самым простым способом было бы обернуть целое число в объект.

0 голосов
/ 02 октября 2018

Поскольку вы обращаетесь к телу запроса, используя req.body.something.Атрибут данных должен быть типом объекта {}.Таким образом,

data: { remain }

Таким образом, вы можете получить доступ с сервера, используя

req.body.remain
0 голосов
/ 02 октября 2018

Я исправил это, поместив число в объект следующим образом:

axios({ method: 'post', url: '/buy', data: { amount : remain}})

Теперь он отправляет правильную информацию.Любое объяснение того, почему это вызвало ошибку, приветствуется

0 голосов
/ 02 октября 2018

Вы объединяете объект со строкой в ​​журнале консоли:

console.log("New Amount:" + req.body)

Попробуйте вместо этого:

console.log("New Amount:", req.body)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...