【问题标题】:Mongodb inserting json from http.post into collection changes the jsonMongodb 将 json 从 http.post 插入到集合中会改变 json
【发布时间】:2016-11-16 23:18:46
【问题描述】:

我正在使用 mongodb、nodejs 等为我的移动应用程序创建一个管理页面。我正在尝试将现有的 json 文件插入到 mongodb 集合中。我尝试了 mongoimport,但它不起作用(我通读并尝试了几个关于它的 stackoverflow 讨论)。所以我想我可以通过 http POST 发送它并使用 insert()。

我运行了三个本地主机服务器:mongodb、应用服务器和网站管理页面

json 文件长这样:

{"data_version":1,"drivers_teams":{"drivers":{"4":{"name":"Hofer","firstname": ... }}}

客户端 POST

    $.getJSON("initialData.json", function(json) {
            $.ajax({
              url: 'localhost:3080/client_data',
              type: 'POST',
              data: json,
              success: function(res) {
                console.log(res);
              }.bind(this),
              error: function(xhr, status, err) {
                console.error(url, status, err.toString());
              }.bind(this)
            });
    }.bind(this));

服务器 POST

app.use(bodyParser.json({limit: '1000kb', parameterLimit: 5000}));
app.use(bodyParser.urlencoded({limit: '1000kb', parameterLimit: 5000, extended: false}));

    app.post('/client_data/', (req, res) => {
      const db = req.db;
      const collection = db.get('collection');

      collection.insert(req.body, function (err, doc) { 
            if (err) {
              res.status(500).send('Invalid request');
              return;
            }  
            res.send('ok');
      });
    });

到目前为止一切顺利,但是在我设法插入数据并询问服务器你得到了什么之后?我明白了:

{"_id":"57872f9fe51246dc1b3bbc93","data_version":"1","drivers_teams[drivers][4][name]":"Hofer","drivers_teams[drivers][4][firstname] ... }}}

我不能再使用这些数据了。所以问题:当嵌套的 json 来自 http 请求正文时,如何按原样插入它?

编辑

好的,想出了如何执行 AS-IS insert()。我直接将 json 加载到集合中,而不是 http.post;

服务器

import mydata from './initialData.json';

...

collection.insert(mydata, function (err, doc) { ... });

我仍然对请求正文做错了什么感到困惑。因为现在如果我做 collection.update();从客户端来看,更新后的元素显然被括号符号弄乱了。

【问题讨论】:

  • 您是否在 mongodb 中看到带有方括号的关键属性,即您问题中的最后一个 json?
  • 你是否在 express 中使用了一些中间件,比如 bodyParser?
  • 是的,app.use(bodyParser.json({limit: '1000kb', parameterLimit: 5000}));
  • 好的,这是body-parser,同样的问题:stackoverflow.com/questions/26711666/…

标签: json mongodb body-parser


【解决方案1】:

解决方案是更改 url 编码的 bodyParser 选项

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

这真的很违反直觉,至少对我来说,因为我正在寻找与 json 相关的问题,而不是表单...... 唯一的缺点是一切都是字符串而不是它们的真实类型,但是一旦我走到了这一步,我就不再关心了。

编辑

要在服务器端正确获取数据类型,我需要 JSON.stringify(data) 并在 POST 选项中添加 contentType: 'application/json'

    post: function(data) {      
        $.ajax({
            url: url,
            type: 'POST',
            data: JSON.stringify(data),
            contentType: 'application/json',
            success: function(res) {
                console.log(res)
            }.bind(this),
            error: function(xhr, status, err) {
                console.error(url, status, err.toString());
            }.bind(this)
        });
    },

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 2021-05-13
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多