使用MongooseJS进行验证,导致NodeJS应用崩溃。

问题描述 投票:0回答:1

我正试图找到一个更好的方法来执行这个验证。 我已经设置了用户schmea,我试图让年龄验证正常工作,以免导致应用程序崩溃。 请原谅我,因为我对这门语言还比较陌生,所以我可能没有100%解释清楚。 然而,这是我创建的用户模式。

const mongoose = require('mongoose')
const validator = require('validator')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        trim: true
    },
    age: {
        type: Number,
        default: 0,
        validate(value) {
            if(value < 13){
                throw new Error('You must be over the age of 13 to register for this site!')
            }
        }
    },
    email: {
        type: String,
        unique: true,
        required: true,
        trim: true,
        lowercase: true,
        validate(value){
            if (!validator.isEmail(value)) {
                throw new Error('Email is invalid')
            }
        }
    },
    password: {
        type: String,
        required: true,
        trim: true,
        minlength: 7,
        validate(value){
            if (value.toLowerCase().includes('password')) {
                throw new Error('Password cannot contain "password"')
            }
        }
    },
    tokens: [{
        token: {
            type: String,
            required: true
        }
    }]
})

userSchema.virtual('tasks', {
    ref: 'Task',
    localField: '_id',
    foreignField: 'owner'
})

userSchema.methods.generateAuthToken = async function () {
    const user = this
    const token = jwt.sign({ _id: user._id.toString() }, 'thisismynewcourse')

    user.tokens = user.tokens.concat({ token })
    await user.save()

    return token
}

userSchema.statics.findByCredentials = async (email, password) => {
    const user = await User.findOne({ email })

    if (!user) {
        throw new Error('Unable to login')
    }

    const isMatch = await bcrypt.compare(password, user.password)

    if (!isMatch) {
        throw new Error('Unable to login')
    }

    return user
}

//Hash the plain text password before saving
userSchema.pre('save', async function(next) {
    const user = this

    if (user.isModified('password')) {
        user.password = await bcrypt.hash(user.password, 8)
    }

    next()
})

userSchema.methods.toJSON = function () {
    const user = this
    const userObject = user.toObject()

    delete userObject.password
    delete userObject.tokens

    return userObject
}

const User = mongoose.model('User', userSchema)

module.exports = User

我试图在年龄部分进行调整,我试图验证13岁或以上的年龄,当我通过post man运行一个测试用户创建时,它正确地执行了验证,但它停止了应用程序,并出现了以下情况。

UnhandledPromiseRejectionWarning: ValidationError: User validation failed: age: You must be over the age of 13 to register

有什么方法可以防止程序崩溃 或者我应该在其他地方进行验证? 先谢谢你。

node.js mongodb mongoose-schema
1个回答
0
投票

通常验证是在另一个文件中进行的。这可以被认为是一个服务。但如果你想正确地进行验证,应该先通过一个控制器。下面是我做的一个简单的博客文章模式的例子。你可以看到底部的函数每次在我把它发送到数据库之前都会运行。

这是我的模式文件看起来是这样的,它位于名为models的文件夹中。

// Requiring modules
const mongoose = require('mongoose');

// Initializing Schema
var Schema = mongoose.Schema;

// Creating a data model
const schema = new Schema({
    shopname : {type: String, required:true},
    address : {type: String, required:true},
    review : {type: String, required:false},

    image : {type: String, required:false},
    originalname: {type: String, required:false},
    filename: {type: String, required:false},
    mimetype: {type: String, required:false},
    size : {type: String, required:false},

    updatedAt: {type: Date, required:false},
    createdAt: {type: Date, required:false}
})

// Settings up the process before the data is sent to mongoDB.
// This process is call everytime 'save' is called.
// it sets the data for createdAt and updatedAt.
schema.pre('save', function(next){
    if (!this.createdAt){
        this.createdAt = new Date();
    }else{
        this.updatedAt = new Date();
    }
    next();
})

// Exports module
module.exports = mongoose.model("Blog", schema);
© www.soinside.com 2019 - 2024. All rights reserved.