Node.js:req.params vs req.body

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

我一直在拼凑一些不同教程中的代码,使用node、express、angular和mongodb,构建一个具有平均堆栈的基本todo应用程序。一个教程介绍了为GET、POST和DELETE操作创建api,但忽略了POST。所以,我把编写一个更新现有todo的函数当作一个挑战。当我让函数工作时,我遇到了一个涉及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);
                });
  };
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);

});