猫鼬 - 如何仅验证特定字段?

Posted

技术标签:

【中文标题】猫鼬 - 如何仅验证特定字段?【英文标题】:mongoose - how to validate specific fields only? 【发布时间】:2016-09-01 14:40:34 【问题描述】:

我有以下猫鼬模型和路由文件。

用户.js

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId,

    var userSchema = new Schema(
        nick_name: 
            type: String,
            unique: true
        ,
        email: 
            type: String,
            unique: true
        ,
        first_name: String,
        last_name: String,
        birth_date: 
             type: Date 
        ,
        password: 
            type: String,
            select: true
        ,
        user_type: 
            type: Number,
        ,
        is_active: 
            type: Number,
            default: -1
        
    ,  collection: 'user' );


/*
 *Validations
 */
userSchema.path('nick_name').required(true, 'nick name is required!');
userSchema.path('email').required(true, 'email is required!');
userSchema.path('password').required(true, 'password is required!');
userSchema.path('user_type').required(true, 'user type is required!');
userSchema.path('is_active').required(true, 'is active is required!');
userSchema.path('is_close').required(true, 'is close is required!');


userSchema.path('first_name').required(true, 'first name is required!');
userSchema.path('last_name').required(true, 'last name is required!');
userSchema.path('birth_date').required(true, 'birth date is required!');

var User = module.exports = mongoose.model("User", userSchema);

路由器.js

var express = require('express');
var router = express.Router();
var User = require('../models/user');
router
    .route('/api/user/register')
    .post(
        function(req, res, next) 
            var user_ = new User(req.body);
            /*
             *here all validations are required
             */
            user_.validate(function(err) 
                    if (err) 
                        res.json( "status": 0, "error": err );
                     else 
                        user_.save(function(err) 
                            if (err) 
                                res.json( "status": 0, "error":  "other": "Oops! something went wrong, please try again later."  );
                             else 
                                res.json( error: 1, message: 'User registered' );
                            
                        );
                    
                
            );
    
);

在上面的路由文件中,我可以使用 validate() 方法验证所有字段,但是,我需要按照以下条件进行验证

->用户注册时,需要以下字段 昵称 电子邮件 密码 用户类型 is_active ->当用户编辑他的个人资料时(注册后),所有字段都是必需的。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

我刚刚发现自己处于这种情况,想要更新评论模型并想要对字段“内容”进行特定字段验证。

我正在考虑一个 hack,从数据库中提取完整的评论文档,然后从我刚刚从数据库中提取的评论文档中创建一个具有相同属性的新模式对象,并像我一样验证此文档模型副本本来要创建一个新文档,但我不会,我不会使用 save() 方法。如果“内容”字段有错误,这是我唯一关心的,我会在验证后知道,如果没有错误,那么我会忘记我通过从评论文档中拉出创建的新对象模式副本数据库,我忘了它,因为我已经知道我的“内容”字段是有效的,因为没有显示错误,所以我继续我的流程。

也许我可以创建一个带有一些虚假但有效字段的新对象,而不是从数据库中提取该文档...然后传递我想要测试的真实值,在我的情况下是“内容”,我不会伪造那个值,因为我已经有了它。

注意:我的评论模型具有属性“createdAt”,因此我会将其替换为当前日期,因为我可能会在验证时出错,说明新评论必须来自当前日期,而不是来自过去日期,但因为我不会保存那个新日期到数据库我可以添加当前日期,回想一下我会忘记那个新对象,我不会将它保存到数据库中,我只关心“内容”字段验证,看看是否有任何错误。

【讨论】:

感谢您的回答。事实上,这个答案的格式很差,很难阅读和理解。在发布之前,请务必在预览部分查看您的帖子。代码是否正确marked and indented?您是否使用了足够的段落和other formatting tools?请edit您的帖子,直到它易于阅读和理解。另请阅读How to Answer 上的文章。格式正确的答案会让您获得更多的支持,并有更高的机会被接受。

以上是关于猫鼬 - 如何仅验证特定字段?的主要内容,如果未能解决你的问题,请参考以下文章

使用 2 个字段的猫鼬自定义验证

仅填充猫鼬中的特定字段

猫鼬条件必填字段验证

验证多个猫鼬文档并更新

验证数组内容猫鼬模型

在结果消息猫鼬节点验证中显示实际错误