对象属性关键字在客户端(Express)中是不同的,

我使用Node,Express和MongoDB / Mongoose来处理我的第一个CRUD应用程序(梦想杂志)。

我创build一个基于几个用户表单input的简单对象,然后向服务器提交一个post请求,然后调用Mongoose.save()。

然而,我在客户端创build的对象与服务器正在接收的对象略有不同,我完全丧失了原因。

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

// 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 }; 

在这里,一个console.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 req.body产生:

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

任何想法为什么客户端的tags属性变成'tags[ ]'当它通过POST请求通过?

我试过两个tags: Arraytags: [String]在我的Mongoose模型,但问题似乎发生之前,我曾经调用Mongoose.save.

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

您可以通过手动将数据转换为JSON并适当设置内容types来发生这种情况:

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

然后,您可能还需要在服务器端parsingJSON,无论是手动执行此请求还是使用一些中间件(如bodyParser.json()