req.body中的对象属性键与客户端(Express)不同

时间:2016-08-08 03:36:51

标签: node.js express

我使用Node,Express和MongoDB / Mongoose在我的第一个CRUD应用程序(梦想期刊)上做了一个菜鸟。

我正在基于一些用户表单输入创建一个简单的对象,然后向服务器提交一个post请求,后者又调用Mongoose.save()。

然而,我在客户端创建的对象与服务器接收的对象略有不同,我完全不知道为什么。

首先,我从表单中获取一些值并将它们放在一个对象中:

    // within button click event handler

    var dreamText  = $('#dream-text').val().trim();
    var dreamTags  = ["tag 1", "tag 2", "tag 3"]; // for debugging
    var dreamLucid = $('#dream-lucid').val() == 'Yes' ? true : false;
    var dreamDate  = $('#dream-date').val();

    var dream = {
        userID: 'test',
        text: dreamText,
        tags: dreamTags,
        isLucid: dreamLucid,
        dateCreated: dreamDate
    };

这里有一个控制台.log的梦想显示应有的一切:

Object {userID: "test", text: "sample text", tags: Array[3], isLucid: false, dateCreated: "2016-08-08"}

从那里我提交了一个带有梦想对象的POST请求:

    $.ajax({
        type: 'POST',
        url: '/new',
        data: dream,
        success: function(data){
            console.log('dream saved');
        }
    });

现在在服务器端,使用Express和Mongoose,我正在尝试将对象保存到数据库:

router.post('/', urlencodedParser, function(req, res) {
    console.log(req.body);
    var newDream = Dream(req.body).save(function(err, data){
        if (err) {
            throw error;
        }
    });
});

除标记之外的所有属性都正确保存,并且req.body的console.log产生:

{ userID: 'test',
  text: 'sample text',
  'tags[]': [ 'tag 1', 'tag 2', 'tag 3' ],
  isLucid: 'false',
  dateCreated: '2016-08-08' }

知道客户端的tags属性在通过POST请求时变为'tags[ ]'的原因吗?

我在我的Mongoose模型中尝试了tags: Arraytags: [String],但问题似乎是在我调用Mongoose.save.之前发生的

1 个答案:

答案 0 :(得分:0)

默认情况下,$.ajax()将POST操作编码为application/x-www-form-urlencoded,它对数组执行不同的操作。您可能只想发送JSON,以便在服务器上接收JSON。

您可以通过手动将数据转换为JSON并适当设置内容类型来实现这一点:

$.ajax({
    type: 'POST',
    url: '/new',
    data: JSON.stringify(dream),
    contentType: "application/json",
    success: function(data){
        console.log('dream saved');
    }
});

然后,您可能还需要在服务器端解析JSON,可以手动为此请求解析,也可以使用bodyParser.json()等中间件解析。