【发布时间】:2014-09-18 12:21:25
【问题描述】:
我一直在拼凑来自几个不同教程的代码,用 MEAN 堆栈构建一个基本的 todo 应用程序,使用 node、express、angular 和 mongodb。一个教程涵盖了为 GET、POST 和 DELETE 操作创建 api,但忽略了 POST。因此,我将编写一个更新现有待办事项的函数视为一项挑战。当我让函数工作时,我遇到了一个我不理解的涉及 req.params 的错误。
相关代码:
节点:
在 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);
});
});
};
角度:
$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);
});
};
翡翠/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
可以很好地检索 todo 的 '_id' 属性并使用它在数据库中查找适当的文档。此外,在 Firefox 的开发者工具中查看请求时,待办事项对象以 JSON 格式显示在“参数”选项卡下。
为什么会这样?使用 req.params 与 req.body 有什么区别,为什么第二个有效而第一个无效?
【问题讨论】: