Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose-PUT请求时.save()出错_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose-PUT请求时.save()出错

Node.js Mongoose-PUT请求时.save()出错,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个用户模型,在其中根据需要放置密码字段。问题是,当我尝试在不发送密码的情况下更新用户时,会出现一个错误,因为它表示需要密码 如何在创建时将密码设置为required,而不是在更新时?扩展这一点,我如何创建一个端点,该端点可以在请求上接收1到4个属性 放置端点 exports.putUsuario = function(req, res) { Usuario.findById(req.user._id, function(err, usuario) { if (err

我有一个用户模型,在其中根据需要放置
密码
字段。问题是,当我尝试在不发送
密码的情况下更新用户时,会出现一个错误,因为它表示需要
密码

如何在创建时将密码设置为required,而不是在更新时?扩展这一点,我如何创建一个端点,该端点可以在请求上接收1到4个属性

放置端点

exports.putUsuario = function(req, res) {
    Usuario.findById(req.user._id, function(err, usuario) {
        if (err)
            res.send(err);

        if (usuario){
        // Update the existing beer quantity
        usuario.password = req.body.password;
        usuario.nome = req.body.nome;
        usuario.sexo = req.body.sexo;
        usuario.idade = req.body.idade;

        // Save the beer and check for errors
        usuario.save(function(err) {
            if (err)
                res.send(err);

            res.json(usuario);
        });
      }
      else {
        res.json(usuario);
      }
    });
};
返回给邮递员的错误

{
  "errors": {
    "password": {
      "message": "Path `password` is required.",
      "name": "ValidatorError",
      "properties": {
        "type": "required",
        "message": "Path `{PATH}` is required.",
        "path": "password"
      },
      "kind": "required",
      "path": "password"
    }
  },
  "message": "Usuario validation failed",
  "name": "ValidationError"
}

您每次都在设置密码,即使密码为空/未定义

在设置请求正文之前,测试其是否具有密码:

if (req.body.password) {
    usuario.password = req.body.password;
}

您每次都在设置密码,即使密码为空/未定义

在设置请求正文之前,测试其是否具有密码:

if (req.body.password) {
    usuario.password = req.body.password;
}

我不认为可以在“每次保存”的基础上禁用验证:它要么为所有
save()
(和
create()
)操作启用,要么不启用(在这种情况下,如果需要,可以手动验证)。也许值得研究一下,默认情况下,验证是禁用的。谢谢您的解释,@robertklep。更改为
findbyiandupdate
修复了此错误。但是现在这并不是通过
Model.pre('save',function())
中间件运行的。啊,是的,这不起作用。但我认为有一个
findOneAndUpdate
钩子会被调用。我不认为您可以在“每次保存”的基础上禁用验证:它要么为所有
save()
(和
create()
)操作启用,要么不启用(在这种情况下,您可以手动验证,如果您愿意的话)。也许值得研究一下,默认情况下,验证是禁用的。谢谢您的解释,@robertklep。更改为
findbyiandupdate
修复了此错误。但是现在这并不是通过
Model.pre('save',function())
中间件运行的。啊,是的,这不起作用。但是我想有一个
findOneAndUpdate
hook会被调用。谢谢你的简单修复。尝试了@robertklep建议的
findbyiandupdate
,但它要求我将中间件更改为哈希修改的密码。没问题。很高兴这有帮助。我错误地认为当使用
save()
时,必须有密码。但是由于文档已经存在,所以它在内部作为更新处理+1.谢谢你的轻松修复。尝试了@robertklep建议的
findbyiandupdate
,但它要求我将中间件更改为哈希修改的密码。没问题。很高兴这有帮助。我错误地认为当使用
save()
时,必须有密码。但是由于文档已经存在,所以它在内部作为更新处理+1.