簡體   English   中英

Node.js:req.params vs req.body

[英]Node.js: req.params vs req.body

我一直在拼湊幾個不同教程的代碼,用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有什么區別,為什么第二個工作而第一個不工作?

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

req.params是您在請求url參數或請求的標題部分中發送的部分。

郵差中的req.params示例

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

郵遞員中的req.body例子

req.body是我們在郵遞員中發送的JSON數據,因此我們可以在郵件請求正文部分中訪問它。

route.post('/ninjas',function(req,res,next)
{
    Ninja.create(req.body).then(function(ninja)
    {
        console.log("POST"+req.body);
    res.send(ninja);
    })
    .catch(next);

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM