【问题标题】:React.js Using axios to send integer data but get [object object] in Node.jsReact.js 使用 axios 发送整数数据但在 Node.js 中获取 [object object]
【发布时间】:2019-03-07 22:36:04
【问题描述】:

我正在尝试使用React 中的axios 向后端发送一个整数以执行一些计算。但是,在后端,我得到了[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})
}

【问题讨论】:

    标签: javascript node.js reactjs axios


    【解决方案1】:

    通常,数字、布尔值、字符串和没有任何对象或数组的 null 也是有效的 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 会抱怨接收到的数据不是有效的 json。这是因为以下选项:

    严格
    当设置为true时,将只接受数组和对象;当false 将接受任何JSON.parse 接受时。默认为true。

    您的代码可以使用body-parser 的选项strict: false 与axios 的Content-Type 标头设置结合使用。

    所以可以让它工作,但最简单的方法是将整数包装到一个对象中。

    【讨论】:

      【解决方案2】:

      我通过将数字放入这样的对象来修复它:

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

      现在它正在发送正确的信息。任何关于它为什么导致错误的解释表示赞赏

      【讨论】:

      • 是的,数据必须是对象的类型,{ }。
      【解决方案3】:

      您正在将对象与控制台日志中的字符串连接起来:

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

      试试这个:

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

      【讨论】:

      • 打印不是问题。我更改为新的 console.log,我得到 New Amount: {} 这是一个空对象
      【解决方案4】:

      由于您使用 req.body.something 访问请求正文。数据属性必须是对象类型 {}。 像这样,

      data: { remain }
      

      所以你可以使用从服务器访问

      req.body.remain
      

      【讨论】:

      • 您可以使用req.body 访问整个正文,正文将包含数字、字符串、布尔值、空值、对象或数组作为其内容。 body-parse 模块默认只接受 [] 或 {} 即使其他也是有效的 JSON。使用strict: false 它将接受所有这些。要让 axios 发送 json 内容类型标头,您必须手动设置它。使用data: { remain } 是解决问题的一种方法,但不是必需的。
      猜你喜欢
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2020-02-09
      • 2021-10-07
      • 2018-06-18
      • 2020-08-11
      相关资源
      最近更新 更多