Node.js:req.params vs req.body
我一直在拼凑一些不同教程中的代码,使用node、express、angular和mongodb,构建一个具有平均堆栈的基本todo应用程序。一个教程介绍了为GET、POST和DELETE操作创建api,但忽略了POST。所以,我把编写一个更新现有todo的函数当作一个挑战。当我让函数工作时,我遇到了一个涉及req.params的错误,我不理解 相关代码: 节点: 在app.js中Node.js:req.params vs req.body,node.js,angularjs,express,Node.js,Angularjs,Express,我一直在拼凑一些不同教程中的代码,使用node、express、angular和mongodb,构建一个具有平均堆栈的基本todo应用程序。一个教程介绍了为GET、POST和DELETE操作创建api,但忽略了POST。所以,我把编写一个更新现有todo的函数当作一个挑战。当我让函数工作时,我遇到了一个涉及req.params的错误,我不理解 相关代码: 节点: 在app.js中 app.put('/api/todos/:_id', ngRoutes.update); 这导致: exports
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);
});
};
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}}")
此函数工作正常。它更新有问题的todo,并使用更新后的值返回要重新加载到页面上的整个列表
但是,如果在节点代码中,我更改
content : req.body.formText
到
我收到以下错误作为HTTP响应:
Object {
message: "Cast to string failed for value "undefined" at path "content"",
name: "CastError",
type: "string",
path: "content" }
即使在功能的其他地方
req.params._id
检索todo的'\u id'属性并使用它在数据库中查找适当的文档很好。此外,在Firefox的开发者工具中查看请求时,todo对象以JSON格式显示在“Params”选项卡下
为什么会发生这种情况?使用req.params和req.body之间有什么区别,为什么第二个有效而第一个无效
req.params
用于路由参数,而不是表单数据
该路由中唯一的参数是\u id
:
app.put('/api/todos/:_id', ...)
从文档中:
请求参数
此属性是包含映射到的属性的对象 命名的路由为“参数”。例如,如果您有路线 /user/:name,则“name”属性可作为req.params.name使用。 此对象默认为{} 资料来源: 请求正文
包含请求中提交的数据的键值对 身体。默认情况下,它是未定义的,并且在使用时填充 主体解析中间件,如主体解析器和multer
来源:req.params是您在请求url参数中发送的部分或请求的标题部分 req.body是我们在postman中发送的JSON数据,因此我们可以在post请求主体部分中访问它
route.post('/ninjas',function(req,res,next)
{
Ninja.create(req.body).then(function(ninja)
{
console.log("POST"+req.body);
res.send(ninja);
})
.catch(next);
});
非常感谢。这对我来说很清楚。对于Firefox开发者工具中的“Params”指的是什么,我仍然有点困惑,这导致了我的困惑,但这似乎只是指请求主体/负载的一种不同方式。这也帮助了我。当在param、params、表单数据和x-www-form-urlencoded之间使用Postman时,我感到困惑。我用它来测试带有PassportJS的Node/Express API,一开始我不明白为什么我只得到一些用户字段。我必须使用x-www-form-urlencoded、req.body和passReqToCallback:true
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
route.post('/ninjas',function(req,res,next)
{
Ninja.create(req.body).then(function(ninja)
{
console.log("POST"+req.body);
res.send(ninja);
})
.catch(next);
});