我有一个用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
没有通过我的服务器。我的服务器只记录POST
。 PUT
正在其他地方被记录。