mongoose使用validate驗證, 獲取自定義驗證資訊

cc_King發表於2020-12-14

資料模型層(userModel)

const mongoose = require('mongoose');

const reg = require('../../../utils/reg');
// const con = require('../index').getConnection();
const con = mongoose.createConnection('mongodb://127.0.0.1:27017/taobao')

const user = {
    phone: {
        type: String,
        trim: true,
        match: [reg.phone, "電話號碼格式不正確"] // 比較簡單的驗證就可以直接使用 match
    },
    account: {
        type: String,
        trim: true,
        validate: {
            validator: function (data) {
                if (data.length >= reg.account.minLength && data.length <= reg.account.maxLength) {
                    return true
                } else {
                    return false
                }
            },
            message: '使用者名稱格式不正確' // 這裡是返回的錯誤資訊
        },
    },
    age: {
        type: Number,
        validate: {
            validator: function (data) {
                if (data >= 0) {
                    return true
                } else {
                    throw new Error('年齡格式不正確'); // 錯誤資訊也可以以丟擲的錯誤返回,這樣的話就更靈活了
                    return false
                }
            },
            // message: '年齡格式不正確'
        },
    }
}

let userSchema = mongoose.Schema(user);
let userModel = con.model('user', userSchema);

module.exports = userModel;

Dao層(userDao)

說實話我不知道dao層的名稱(苦笑)

const mongoose = require('mongoose');
const regType = require('../../../utils/reg');

const userModel = require('../model/userModel');

async function insertOneUser(object){
    return userModel.create(object);
}

module.exports = {
    insertOneUser
}

test 使用

const userDao = require('../config/mongoDB/Dao/userDao');

userDao.insertOneUser({ account: 'cccccc', age: -1, phone: '1821748' })
    .catch((error) => {
        console.log(getErrorReason(error));
    })

// 這個就是主要的方法了
function getErrorReason(error) {
    // 當有多個驗證不通過的時候.toString(): ValidationError: age: 年齡格式不正確, phone: 電話號碼格式不正確
    // 這裡切割需要依賴 ":" & "," 兩個字元來切割( * 所以的話提示資訊中就不要使用英文的逗號了)
    let errorArray = error.toString().split(/:|,/g);
    let errorObject = {};
    for (let i = 1; i < errorArray.length; i += 2) {
        let key = errorArray[i].trim();
        let value = errorArray[i + 1].trim();
        errorObject[key] = value;
    }
    return errorObject; // console: { age: '年齡格式不正確', phone: '電話號碼格式不正確' } 
}

自定義驗證(reg.js)

const regType = {
    password: {
        index: /^(\w){6,20}$/, // 只能輸入6-20個字母、數字、下劃線 
        week: /^(?:\d+|[a-zA-Z]+|[!@#$%^&*]+)$/, //弱:純數字,純字母,純特殊字元
        middle: /^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*]+$)[a-zA-Z\d!@#$%^&*]+$/, // 中:字母+數字,字母+特殊字元,數字+特殊字元
        strong: /^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&*]+$)(?![\d!@#$%^&*]+$)[a-zA-Z\d!@#$%^&*]+$/, ///強:字母+數字+特殊字元
    },
    phone: /^1[3|4|5|7|8][0-9]{9}$/,
    account: {
        maxLength: 20, // 使用者名稱最大長度
        minLength: 6 // 使用者名稱最小長度

    }
}

module.exports = regType
官方文件
後期上傳專案地址

相關文章