Node.js:req.params vs req.body

 王责宇0218 发布于 2023-01-01 00:44

我一直在拼凑几个不同教程的代码,用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

可以正常工作来检索待办事项的'_id'属性,并使用它来查找数据库中的相应文档.此外,在Firefox的开发人员工具中查看请求时,todo对象在"Params"选项卡下以JSON格式显示.

为什么会这样?使用req.params vs req.body有什么区别,为什么第二个工作而第一个不工作?

1 个回答
  • req.params 用于路径参数,而不是表单数据.

    你在这条路线上唯一的参数是_id:

    app.put('/api/todos/:_id', ...)
    

    来自文档:

    req.params
    此属性是一个对象,包含映射到命名路由"parameters"的属性.例如,如果您有route/user /:name,那么"name"属性可用作req.params.name.该对象默认为{}.

    来源:http: //expressjs.com/en/4x/api.html#req.params

    req.body
    包含请求正文中提交的键值对数据.默认情况下,它是未定义的,并且在使用正文解析器和multer等正文解析中间件时会填充.

    来源:http: //expressjs.com/en/4x/api.html#req.body

    2023-01-01 01:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有