我正在尝试更新在客户端集合中表示为模型的数据和mongo db集合中的文档。该事件触发了执行此操作的方法,即单击视图上的元素。 客户端是一个Backbone应用程序。
在服务器端,我使用带有Express和Mongodb的节点和Waterline ORM。对于这个请求我使用:
app.put('/posts/:id', function(req, res){
app.models.posts.update( req.params.id, function(err, result){
if(err) return res.status(500).json({ err: err });
res.json( result );
});
});
视图中的事件方法是:
updatePost: function(e){
e.preventDefault();
//update the new content of the fields on the server.
//find model to update in the collection by colleciton.findWhere.
this.modelid = $(e.currentTarget).attr('id');
this.modeltoupdate = this.collection.findWhere( { id: this.modelid } );
//change model attributes as needed by model.set().
this.modeltoupdate.set(
{
title: $('#title').text(),
body: $('#body').text(),
});
//save the model on server with wait:true to wait server aknowledge, and add to colelction adn rerender view.
this.modeltoupdate.save(
{
wait:true,
success: function(){
this.collection.add( this.modeltoupdate );
this.render();
this.renderPost();
},
}
);
},
此视图的模板是:
<script type="text/template" id="postTemplate">
<a href="/">All Posts</a>
<p id='author'>{{author}}</p>
<p id='title' contenteditable='false'>{{title}}</p>
<p id='createdat'>{{createdAt}}</p>
<p id='body' contenteditable='false'>{{body}}</p>
<a id='{{id}}' class='editpost' href=''>Edit this post</a>
<a id='{{id}}' class='updatepost' href=''>Update this post</a>
<a href="/">All Posts</a>
</script>
但是我在Safari检查器的资源列表中看到一个带有图标旋转的始终加载资源。单击它并检查与之相关的请求和响应,显示请求是模型的属性,其中包含已更新的字段,但响应显示加载的gif,没有响应。
内容可编辑属性没有问题,单击“更新此帖子”链接时,它们都设置为true。
这是我创建的服务器端路由,req参数或req主体吗? BB将它们发送到目标/posts/548e00e61e96a70d0fa4ad50
,所以/posts/:id
,这似乎是我的app.put()网址是正确的。
答案 0 :(得分:1)
问题在于app.put()函数中的服务器端代码。代码片段调用此函数时缺少必需参数,第二个参数未提供给它。第二个参数是要放入现有模型的新值,该值由搜索条件(第一个参数)选择。
app.put('/posts/:id', function(req, res){
app.models.posts.update( {id: req.params.id}, req.body, function(err, result){
if(err) return res.status(500).json({ err: err });
res.json( result );
});
});
或者只更新更改的值:
app.put('/posts/:id', function(req, res){
var changedmodel = {
id: req.params.id,
title: req.body.title,
body: req.body.body
};
app.models.posts.update( {id: req.params.id}, changedmodel, function(err, result){
if(err) return res.status(500).json({ err: err });
res.json( result );
});
});