React + Backbone 应用程序生成 2 个 POSTS 而不是 1 个

React + Backbone application making 2 POSTS instead of 1

我有一个用 React 和 Backbone 实现的 restful 待办事项列表。

目前,我不是在与数据库对话;在我的 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 开发中。模式,我看到了:

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

两个 PUT 请求!

试图通过它推理 - save() 被调用而调用 sync()。由于该模型还没有 id(只有 cid),它发出 POST 请求并将待办事项 (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});
},
...
}

为什么会这样?
为什么除了 POSTing 之外还有 PUTting?为什么要执行两次?

编辑:

我通过将 create 更改为 add - 来解决双重 POST 我得到帮助的地方。

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

我通过将 create 更改为 add

解决了双重 POST

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

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

因为事件导致 createsave 都被执行,所以 POST 触发了两次。