我使用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: Array
和tags: [String]
,但问题似乎是在我调用Mongoose.save.
之前发生的
答案 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()
等中间件解析。