Node.js 使用mongoose进行表单验证

Node.js 使用mongoose进行表单验证,node.js,mongodb,validation,express,mongoose,Node.js,Mongodb,Validation,Express,Mongoose,我的用例: function checkSignup(req, res, next) { var formField = req.params.field var expectedFormFields = ["username", "emailAddress", "password"] // Check if it's an expected field if(!expectedFormFields.includes(formField)) re

我的用例:

function checkSignup(req, res, next) {
    var formField = req.params.field
    var expectedFormFields = ["username", "emailAddress", "password"]

    // Check if it's an expected field
    if(!expectedFormFields.includes(formField))
        res.status(403).send('Invalid request')

    if(formField == 'username') {
        var user = User.findOne({'local.username': req.body.value}, function (err, user) {
            if(err)
                res.status(403).send('Invalid request')

            if(user)
                res.status(409).send('Username is already forgiven')

            res.status(200).send()
        })
    }

    res.status(409).send('Unknown validation check, please contact a staff member')
}
var userSchema = mongoose.Schema({
    local: {
        username: {
            type: String,
            required: [true, 'Empty usernames are not allowed'],
            validate: usernameValidator
        }});
var usernameValidator = [
    validate({
        validator: 'isLength',
        arguments: [3, 50],
        message: 'Userame should be between {ARGS[0]} and {ARGS[1]} characters'
    }),
    validate({
        validator: 'isAlphanumeric',
        passIfEmpty: false,
        message: 'Name should contain alpha-numeric characters only'
    })
]
我正在做一个注册页面,我正在向我的服务器发送一个关于用户名的ajax请求。服务器应该检查它是否符合验证规则(例如字母数字),以及用户名是否被原谅或可以自由使用

我的想法:

function checkSignup(req, res, next) {
    var formField = req.params.field
    var expectedFormFields = ["username", "emailAddress", "password"]

    // Check if it's an expected field
    if(!expectedFormFields.includes(formField))
        res.status(403).send('Invalid request')

    if(formField == 'username') {
        var user = User.findOne({'local.username': req.body.value}, function (err, user) {
            if(err)
                res.status(403).send('Invalid request')

            if(user)
                res.status(409).send('Username is already forgiven')

            res.status(200).send()
        })
    }

    res.status(409).send('Unknown validation check, please contact a staff member')
}
var userSchema = mongoose.Schema({
    local: {
        username: {
            type: String,
            required: [true, 'Empty usernames are not allowed'],
            validate: usernameValidator
        }});
var usernameValidator = [
    validate({
        validator: 'isLength',
        arguments: [3, 50],
        message: 'Userame should be between {ARGS[0]} and {ARGS[1]} characters'
    }),
    validate({
        validator: 'isAlphanumeric',
        passIfEmpty: false,
        message: 'Name should contain alpha-numeric characters only'
    })
]
我已经在我的mongoose模型上定义了验证规则。为了避免两次定义完全相同的验证规则,我想使用mongoose模式来检查验证规则,如果查询通过,那么它应该尝试在db中查找用户名,以检查它是否仍然可用

问题:

function checkSignup(req, res, next) {
    var formField = req.params.field
    var expectedFormFields = ["username", "emailAddress", "password"]

    // Check if it's an expected field
    if(!expectedFormFields.includes(formField))
        res.status(403).send('Invalid request')

    if(formField == 'username') {
        var user = User.findOne({'local.username': req.body.value}, function (err, user) {
            if(err)
                res.status(403).send('Invalid request')

            if(user)
                res.status(409).send('Username is already forgiven')

            res.status(200).send()
        })
    }

    res.status(409).send('Unknown validation check, please contact a staff member')
}
var userSchema = mongoose.Schema({
    local: {
        username: {
            type: String,
            required: [true, 'Empty usernames are not allowed'],
            validate: usernameValidator
        }});
var usernameValidator = [
    validate({
        validator: 'isLength',
        arguments: [3, 50],
        message: 'Userame should be between {ARGS[0]} and {ARGS[1]} characters'
    }),
    validate({
        validator: 'isAlphanumeric',
        passIfEmpty: false,
        message: 'Name should contain alpha-numeric characters only'
    })
]
不幸的是,它似乎没有检查查询的验证(而是在保存之前才检查),因此我不知道如何使用mongoose验证规则来验证用户名输入

我的代码:

function checkSignup(req, res, next) {
    var formField = req.params.field
    var expectedFormFields = ["username", "emailAddress", "password"]

    // Check if it's an expected field
    if(!expectedFormFields.includes(formField))
        res.status(403).send('Invalid request')

    if(formField == 'username') {
        var user = User.findOne({'local.username': req.body.value}, function (err, user) {
            if(err)
                res.status(403).send('Invalid request')

            if(user)
                res.status(409).send('Username is already forgiven')

            res.status(200).send()
        })
    }

    res.status(409).send('Unknown validation check, please contact a staff member')
}
var userSchema = mongoose.Schema({
    local: {
        username: {
            type: String,
            required: [true, 'Empty usernames are not allowed'],
            validate: usernameValidator
        }});
var usernameValidator = [
    validate({
        validator: 'isLength',
        arguments: [3, 50],
        message: 'Userame should be between {ARGS[0]} and {ARGS[1]} characters'
    }),
    validate({
        validator: 'isAlphanumeric',
        passIfEmpty: false,
        message: 'Name should contain alpha-numeric characters only'
    })
]
检查注册:

function checkSignup(req, res, next) {
    var formField = req.params.field
    var expectedFormFields = ["username", "emailAddress", "password"]

    // Check if it's an expected field
    if(!expectedFormFields.includes(formField))
        res.status(403).send('Invalid request')

    if(formField == 'username') {
        var user = User.findOne({'local.username': req.body.value}, function (err, user) {
            if(err)
                res.status(403).send('Invalid request')

            if(user)
                res.status(409).send('Username is already forgiven')

            res.status(200).send()
        })
    }

    res.status(409).send('Unknown validation check, please contact a staff member')
}
var userSchema = mongoose.Schema({
    local: {
        username: {
            type: String,
            required: [true, 'Empty usernames are not allowed'],
            validate: usernameValidator
        }});
var usernameValidator = [
    validate({
        validator: 'isLength',
        arguments: [3, 50],
        message: 'Userame should be between {ARGS[0]} and {ARGS[1]} characters'
    }),
    validate({
        validator: 'isAlphanumeric',
        passIfEmpty: false,
        message: 'Name should contain alpha-numeric characters only'
    })
]
我的猫鼬模式:

function checkSignup(req, res, next) {
    var formField = req.params.field
    var expectedFormFields = ["username", "emailAddress", "password"]

    // Check if it's an expected field
    if(!expectedFormFields.includes(formField))
        res.status(403).send('Invalid request')

    if(formField == 'username') {
        var user = User.findOne({'local.username': req.body.value}, function (err, user) {
            if(err)
                res.status(403).send('Invalid request')

            if(user)
                res.status(409).send('Username is already forgiven')

            res.status(200).send()
        })
    }

    res.status(409).send('Unknown validation check, please contact a staff member')
}
var userSchema = mongoose.Schema({
    local: {
        username: {
            type: String,
            required: [true, 'Empty usernames are not allowed'],
            validate: usernameValidator
        }});
var usernameValidator = [
    validate({
        validator: 'isLength',
        arguments: [3, 50],
        message: 'Userame should be between {ARGS[0]} and {ARGS[1]} characters'
    }),
    validate({
        validator: 'isAlphanumeric',
        passIfEmpty: false,
        message: 'Name should contain alpha-numeric characters only'
    })
]
用户名验证程序:

function checkSignup(req, res, next) {
    var formField = req.params.field
    var expectedFormFields = ["username", "emailAddress", "password"]

    // Check if it's an expected field
    if(!expectedFormFields.includes(formField))
        res.status(403).send('Invalid request')

    if(formField == 'username') {
        var user = User.findOne({'local.username': req.body.value}, function (err, user) {
            if(err)
                res.status(403).send('Invalid request')

            if(user)
                res.status(409).send('Username is already forgiven')

            res.status(200).send()
        })
    }

    res.status(409).send('Unknown validation check, please contact a staff member')
}
var userSchema = mongoose.Schema({
    local: {
        username: {
            type: String,
            required: [true, 'Empty usernames are not allowed'],
            validate: usernameValidator
        }});
var usernameValidator = [
    validate({
        validator: 'isLength',
        arguments: [3, 50],
        message: 'Userame should be between {ARGS[0]} and {ARGS[1]} characters'
    }),
    validate({
        validator: 'isAlphanumeric',
        passIfEmpty: false,
        message: 'Name should contain alpha-numeric characters only'
    })
]

您在
checkSignup
功能中遇到了一个大问题:您多次返回响应。每次返回响应时,请尝试在每个
res.status…
前面添加
return
语句,以确保不会多次发送响应。这将抛出一个异常。感谢您指出,修复了:-)。我现在有相同的问题。想知道是否有任何方法可以使用mongoose模式进行前端验证。您在
checkSignup
函数中遇到了一个大问题:您多次返回响应。每次返回响应时,请尝试在每个
res.status…
前面添加
return
语句,以确保不会多次发送响应。这将抛出一个异常。感谢您指出,修复了:-)。我现在有相同的问题。想知道是否有任何方法可以使用mongoose模式进行前端验证。