Node.js:req.params 与 req.body

标签 node.js angularjs express

我一直在拼凑来自几个不同教程的代码,以使用 MEAN 堆栈构建一个基本的待办事项应用程序,使用 node、express、angular 和 mongodb。一个教程介绍了为 GET、POST 和 DELETE 操作创建 api,但忽略了 POST。因此,我将编写一个更新现有待办事项的函数作为一项挑战。当我使函数正常工作时,我遇到了一个我不理解的涉及 req.params 的错误。

相关代码:

Node :

在 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);
    });
    });
    };

Angular :

    $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}}")

这个函数工作正常。它更新有问题的待办事项,并返回整个列表以使用更新后的值重新加载到页面上。

但是,如果在 Node 代码中,我改变

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 对象以 JSON 格式显示在“Params”选项卡下。

为什么会这样?使用 req.params 与 req.body 之间有什么区别,为什么第二个有效而第一个无效?

最佳答案

req.params 用于路由参数,而不是您的表单数据。

你在该路由中唯一的参数是 _id:

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

来自文档:

req.params
This property is an object containing properties mapped to the named route “parameters”. For example, if you have the route /user/:name, then the “name” property is available as req.params.name. This object defaults to {}.

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

req.body
Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as body-parser and multer.

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

关于Node.js:req.params 与 req.body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976172/

相关文章:

node.js - header 未使用 node.js/Express 设置重定向

angularjs - 构建用于服务器端过滤和分页的 Angular 应用程序

node.js - npm install 似乎没有获得所有依赖项

node.js - 如何跟踪和处理 Node 中的事件

node.js + 连接 404 错误

javascript - AngularJS 创建一个指令然后使用另一个指令

javascript - 在 AngularJS 中路由时包含 Controller

node.js - 返回前更新 mongoose 文档

angularjs - 如何使用 Angular 收集多个表单提交并一次提交到 mongoose 模型?

node.js - mime.lookup 不是在 docker 内运行的expressjs中的函数