通过Express持续更新Backbone模型

时间:2014-12-16 21:00:12

标签: node.js backbone.js express sails.js waterline

我正在尝试更新在客户端集合中表示为模型的数据和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()网址是正确的。

1 个答案:

答案 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 );
  });
});