【问题标题】:Nodejs express bodyParser drops object keysNodejs express bodyParser 丢弃对象键
【发布时间】:2019-05-15 07:52:13
【问题描述】:

我正在使用 nodejs express 4.16.3 和 body-parser 1.18.3

我通过 ajax 将 JSON 对象从前端发送到我的服务器以将其保存为 .json 文件。

有我前面的代码:

function sendobj (datapack) {
  console.log(JSON.stringify(datapack))
  $.ajax({
    url: '/save',
    method: "POST",
    data: datapack,
    success: function(results) {
      alert(results.status)
    }
  });
}

触发此函数和ajax调用后的控制台输出

{"nametest":{
"lov":{"2":{"val":"15"}},
"gte":{"2":{"val":"9"}},
}}

此时,一切正常——“lov”和“gte”都是对象,我需要的键都是“2”。

但在服务器端,有我的应用代码:

 var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

    app.post('/save', async (req, res) => {
      try {
      console.log(req.body)

      await fs.writeFile('output.json', JSON.stringify(req.body), function(err) {
    if (err) {
      res.send({
        status: 'Error!'
      })
      return
    }

    res.send({
      status: 'Saved!'
    })

  });

} catch (e) {
  console.log(e)
}
});

服务器控制台输出:

{ nametest:
{ gte: [ { val: '9' } ],
  lov: [ { val: '15' } ]
   } }

输出.json

{"nametest":{"gte":[{"val":"9"}],"lov":[{"val":"15"}]}}

看起来我的主要对象 'gte' 和 'lov' 被转换为数组并且它们丢失了它们的键..

我的应用程序/ajax 设置中是否缺少某些内容?

【问题讨论】:

  • 这可能与您的问题无关,但 async/await 仅适用于 Promise,并且 fs.writeFile 不会返回 Promise。
  • 你的console.log只是一个表面的视图,如果文件已经接收到正确的数据,那么body数据是正确的,如果你还有疑问,在你的对象中使用Object.keys()看看按键。正如保罗所说,await 只会在有 promise fs.writeFile 不是 promise 的情况下才会得到结果。

标签: node.js ajax express server body-parser


【解决方案1】:

可能是您没有通过有效的 JSON 发送吗?

试试这个。你有一个额外的逗号。

{"nametest":{
"lov":{"2":{"val":"15"}},
"gte":{"2":{"val":"9"}}
}}

【讨论】:

  • 这个逗号是一个错字,如果它存在则中间件返回了一个 json 语法错误。
【解决方案2】:

在您的 AJAX 请求中,您需要对有效负载进行字符串化。

function sendobj (datapack) {
  console.log(JSON.stringify(datapack))
  $.ajax({
  url: '/save',
  method: "POST",
  data: JSON.stringify(datapack),
  success: function(results) {
    alert(results.status)
  }
  });
}

在 express 中,确保添加 application/json 类型。如

app.use(bodyParser.json({ type: 'application/json' }))

然后退出nametest。 req.body.nametest 这是我得到的输出

{ lov: { '2': { val: '15' } }, gte: { '2': { val: '9' } } }

希望有帮助

【讨论】:

  • console.log(req.body.nametest) 在服务器控制台和服务器端给我未定义的数据看起来像这样:{'{"nametest":{"lov":{"2":{ "val":"17"}},"gte":{"2":{"val":"9"}} }
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多