我一直在拼凑几个不同教程的代码,用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的开发人员工具中查看请求时,todo对象在“Params”选项卡下以JSON格式显示。
为什么会这样?使用req.params vs req.body有什么区别,为什么第二个工作而第一个不工作?
答案 0 :(得分:10)
req.params
用于路由参数,而不是表单数据。
您在该路线中唯一的参数是_id
:
app.put('/api/todos/:_id', ...)
来自文档:
<强> req.params 强>
此属性是包含映射到的属性的对象 命名路由“参数”。例如,如果您有路线 / user /:name,然后“name”属性可用作req.params.name。 该对象默认为{}。
来源:http://expressjs.com/en/4x/api.html#req.params
<强> req.body 强>
包含请求中提交的键值对数据 身体。默认情况下,它是未定义的,并在您使用时填充 身体解析中间件,如body-parser和multer。
答案 1 :(得分:0)
req.params 是您在请求url参数中发送的部分或请求的标头部分。
We have
(dataAdd)="onDataAdd(i, $event)"
(dataRemove)="onDataRemove(i, $event)"
(dataMove)="onDataMove(i, $event)"
(dragEnd)="onDragEnd(i, $event)"
(dragOver)="onDragOver(i, $event)"
(dragStart)="onDragStart(i, $event)"
req.body是我们在邮递员中发送的JSON数据,因此我们可以在邮寄请求正文部分中访问它。
In example above req.params is the data we are sending in postman after ninjas in the
url.
route.delete('/ninjas/:id',function(req,res,next)
{
Ninja.findByIdAndRemove({_id:req.params.id}).then(function(ninja)
{
console.log(ninja.toString());
res.send(ninja);
})
.catch(next);
});
req.body is the part you send in body part of requests