我一直在拼凑来自不同教程的代码,使用MEAN技术栈(即使用node、express、angular和mongodb)构建一个基本的待办事项应用程序。其中一份教程介绍了创建GET、POST和DELETE操作的API,但忽略了POST。因此,我把它视为一个挑战,编写一个函数来更新现有的待办事项。虽然我让这个函数工作了,但我遇到了一个涉及req.params的错误,我并不理解。
相关代码:
Node:
在app.js中:
app.put('/api/todos/:_id', ngRoutes.update);
导致:
exports.update = function(req, res){
var user_id = req.cookies ?
req.cookies.user_id : undefined;
Todo.findByIdAndUpdate(req.params._id,
{ $set: {
updated_at : Date.now(),
content : req.body.formText
}}, function (err, todo) {
if (err)
res.send(err)
Todo.find({ user_id : user_id}, function(err, todos) {
if (err) res.send(err);
res.json(todos);
});
});
};
Angular:
$scope.update = function(id) {
$http.put('/api/todos/' + id, this.todo)
.success(function(data) {
console.log(data);
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
};
Jade/HTML:
form(ng-submit="update(todo._id)")
input.update-form(ng-show="todo.updating" type="text", name="content", ng-model="todo.formText" placeholder="{{todo.content}}")
这个函数工作良好。它更新了相关的待办事项,并返回整个列表,以便重新加载到页面上,显示更新后的值。
然而,如果在节点代码中,我进行更改:
content : req.body.formText
到
content : req.params.formText
我的HTTP响应中出现了以下错误:
Object {
message: "Cast to string failed for value "undefined" at path "content"",
name: "CastError",
type: "string",
path: "content" }
即使在函数的其他地方,
req.params._id
这种方法可以很好地检索代办事项的 '_id' 属性,并使用它来在数据库中查找相应的文档。此外,在 Firefox 的开发者工具中查看请求时,在“参数”选项卡下,todo 对象以 JSON 格式显示。
为什么会出现这种情况?使用 req.params 和 req.body 有什么区别,为什么第二个方法可行而第一个不可行?