React + Backbone应用程序制作2个POSTS而不是1个

时间:2015-07-14 02:55:05

标签: javascript rest backbone.js express reactjs

我有一个用React和Backbone实现的宁静Todo List。

现在,我不是在和数据库交谈;我的server.js中只有一个数组var mytodos = []; 这是POST的服务器代码(使用Express):

app.post('/todos', function(req, res) {
    var todo = {
        id: mytodos.length,
        title: req.body.length,
        completed: req.body.completed         
    };

    mytodos.push(todo);
    console.log('POST ' + JSON.stringify(todo));
    res.send(todo);
});

当我将一个项目添加到列表中时,我看到两个POSTS由于某种原因而被制作。

POST: {"id":0,"title":"test","completed":false}
POST: {"id":1,"title":"test","completed":false}

在Chrome Dev中。模式,我明白了:

PUT localhost/todos/0 404 (Not Found)
PUT localhost/todos/1 404 (Not Found)

两个PUT请求!

尝试推理它 - save()被调用,调用sync()。由于模型还没有id(仅cid),它会发出POST请求并将todo(id = 0)添加到mytodos,然后更新模型客户端(添加id属性)。由于检测到了更改,它会执行另一个save()将其发送到服务器(< - 可能在这里错误;不确定更新的模型是否会导致PUT)。

这可能解释了PUT,但不是双重POST。

以下是调用save()的地方(在TodoApp = React.createClass...下:

componentDidUpdate: function() {
    this.props.todos.forEach(function(todo) {
        console.log('componentDidUpdate: ' + todo.id); // logs: undefined, 0, 1
        todo.save();
    });
},
...
save: function(todo, text) {
    console.log('Save: ' + todo.id); // only logged on update
    todo.save({title: text});
    this.setState({editing: null});
},
...
}

为什么会这样? 除了PUT之外,为什么还要POST?为什么要两次呢?

修改

我通过将create更改为add - reference到我得到帮助的位置来解决双重POST问题。

对于肯定在服务器上的项目,最后一个问题是PUT 404 (Not Found)。有趣的是,似乎PUT没有通过我的服务器。我的服务器只记录POSTPUT正在其他地方被记录。

1 个答案:

答案 0 :(得分:0)

我通过将create更改为add

来解决了双重POST问题

更具体地说,根据this与服务器同步,某个事件触发Backbone.Collection.create来电。

在我的React代码中,我有componentDidUpdate调用Backbone.Model.save,它也尝试发送到服务器。 Here

由于该事件导致createsave被执行,因此POST被触发两次。