Mongoose Put方法CastError

时间:2015-03-26 17:10:44

标签: node.js mongodb mongoose

使用以下put mongoose方法,如果我没有填写所有键/值对,我会在邮递员中收到错误!

app.put('/api/users/:user_id', function(req, res) {
    users.update({
        id_userLogin : req.body.id_userLogin,
        userName : req.body.userName,
        email : req.body.email,
        password : req.body.password,
        userNotes: req.body.userNotes
    }, function(err, user) {
        if (err)
            res.send(err);
        users.find(function(err, users) {
            if (err)
                res.send(err)
            res.json(users);
        });
    });
});

如果我放入所有键/值对,但是如果它错过了一对,那么它可以正常工作

"message": "Cast to string failed for value \"undefined\"",
"name": "CastError",
"type": "string"

如果我添加|| ""对于每个参数,我们可以使用所有空参数更新用户。事实上,如果没有更新参数,我们应该保持初始值

任何帮助将不胜感激



2 个答案:

答案 0 :(得分:0)

您应检查所有请求参数是否合理,如果格式错误,请丢弃该请求。对于非强制性参数(例如userNotes),如果未定义,则可以将参数设置为空字符串:

app.put('/api/users/:user_id', function(req, res) {
    if (!req.id_userLogin || userName || password) {
        return res.send('Malformed request', 400);
    }
    users.update({
        id_userLogin : req.body.id_userLogin,
        userName : req.body.userName,
        email : req.body.email,
        password : req.body.password,
        userNotes: req.body.userNotes || ""
    }, function(err, user) {
        if (err)
            res.send(err);
        users.find(function(err, users) {
            if (err)
                res.send(err)
            res.json(users);
        });
    });
});

答案 1 :(得分:0)

我将代码移动到控制器

exports.update = function(req, res, next) {
var id = req.params.id
User.findByIdAndUpdate(id, req.body, function(err, user) {
    if (err) {
        return next(err);
    } else {
        res.json(user);
    }
});

}

和路线

app.route('/api/users/:id').put(users.update);

解决了这个问题。使用此方法,您可以更新其中一个参数