我有我的模型用户。
// models/user.js
var mongoose=require("mongoose");
var Schema=mongoose.Schema;
var userSchema=new Schema({
name:{
type:String,
required:"Es necesario un nombre",
maxlength:[10,"Nombre muy largo max 10"]
},
lastName:{
type:String,
required:"Es necesario el apellido",
maxlength:[10,"Apellido muy largo"]
},
userName:{
type:String,
unique:true,
require:"Es necesario un username",
},
password:{
type:String,
require:"Es necesario un password",
validate:{
validator:function(pass){
if( this.password_confirmation!=undefined)
return this.password_confirmation==pass;
else{
return true;
}
},
message:"Las contraseñas son diferentes"
}
},
email:{
type:String,
require:"Es necesario un email"
}
})
userSchema.virtual("password_confirmation").get(function(){
return this.p_c
}).set(function(password){
this.p_c=password;
})
var User=mongoose.model("User",userSchema);
module.exports=User;
用于登录的端点。
// routes/user.js
router.route("/login").get(login.login_get).post(login.login_post);
// login_post
var login_post=function(req,res,next){
if(!req.body.password || !req.body.userName){
res.send("Error");
}
User.findOne({userName:req.body.userName,password:req.body.password},function(err,us){
if(err)console.log(String(err));
console.log("Usuario encontra",us);
res.send(us);
});
}
我想要做的是以下,在输入 User.findOne 之前从模型中验证,例如这样的。
var user=new User(req.body,function(err){
if(err)res.send("Error",String(err));
});
User.findOne({userName:user.userName,password:user.password},function(err,us){
if(err)console.log(String(err));
console.log("Usuario encontra",us);
res.send(us);
});
避免使用它并从模型中验证。
if(!req.body.password || !req.body.userName){
res.send("Error");
}
或者你可以那样做。
var validate=function(model,next){
if(//NO SE QUE IRIA PARA VALIDAR EL MODELO//){}
next("//Algo como los errores del modelo model.err//);
}
var user=new User(req.body);
validate(user,function(err){
if(err){
console.log(String(err));
res.send("Hubo un error validando los datos",err);
}
}
}
这是为了能够搜索用户,因为创建它不需要做额外的事情,因为如果它抛出了我所做的错误。
从什么时候开始
User.findOne({userName:req.body.userName,password:req.body.password},function(err,us){
if(err)console.log(String(err));
console.log("Usuario encontra",us);
res.send(us);
});
如果没有验证,它只会抛出它没有找到用户,如果我没有输入密码,也不会出错。
分米
我不知道 DTO,在验证它看起来不错时,所以如果我应该在特定情况下创建 DTO 模式,但我要做的是以下,我在示例中所做的是带来错误拉动,它在模型中定义,例如,如果我放了类似的东西
User.create(req.body,function(err,us){
if(err) console.log(String(err));
console.log(us);
});
这确实给我带来了一组错误,例如,如果密码不匹配,或者缺少一个字段,我想为 findOne 做类似的事情,但这不会给我带来错误(那些在 userSchema 中定义的)在 toast 中显示它们,但它没有检测到任何错误,因此它不返回任何内容。
使用您创建 DTO 的内容,我可以做到,但重点是除了库之外,我还想最小化我放置的代码,这就是我查询的原因。
如果我错过了响应代码,我仍然需要更好地优化代码。
这是一个重要的区别:通常,您通过网络传输的对象/模型与您存储在数据库中的对象/模型不同。例如,出于安全原因,您永远不会在回复用户时发送用户密码,也不会允许他们更改记录的某些属性,例如将其与另一个实体相关联的 id 等。
我们通常将存储在数据库中的对象称为 MODEL,将用于在节点之间传输数据的对象称为 DTO(或 Data Transfer Object)。
现在,在 Javascript 中,由于其动态性,并不总是需要创建一个单独的模型(主模型将不起作用,因为它需要 name、lastName 等)。必须在每种情况下对其进行评估。这种情况似乎没有必要,因为它是两个字段并且易于验证。
或者,比为 UserDTO 创建 Schema 更轻松的选择是使用一些轻量级的模式验证库,如指示性。
顺便说一句,在您向我们展示的代码中,当用户在数据库中不存在或密码不匹配时,什么都没有(也许这是一个简化的示例,但我在示例中已将其考虑在内)
我建议您进行的另一项更改是使用适当的响应代码,即 500、401 和 400,具体取决于具体情况(参见代码)
萨鲁2
版:
我理解您在您的版本中所说的话:也许 LOGIN 示例不是最好的情况,因为出于安全原因,您永远不想报告确切的错误。但既然这适用于任何实体,我告诉你指示性有另一种方法。
它返回一个数组,其中包含给定模式的错误/违规列表。它可以告诉您什么。
这是你的选择,我知道添加另一个库是一个艰难的决定,原因有很多,这只是一种选择。
在我看来,它是您的一般问题的一个很好的替代方案,它允许您进行各种验证、自定义错误消息、使用模板和争论错误消息,它允许您清理(又名清理)输入数据和文档它是基于示例的,您可以在 15-20 分钟内阅读。