Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在我的node.js应用程序中验证mongoose架构的单个路径/字段时遇到问题_Javascript_Node.js_Mongodb_Mongoose_Postman - Fatal编程技术网

Javascript 在我的node.js应用程序中验证mongoose架构的单个路径/字段时遇到问题

Javascript 在我的node.js应用程序中验证mongoose架构的单个路径/字段时遇到问题,javascript,node.js,mongodb,mongoose,postman,Javascript,Node.js,Mongodb,Mongoose,Postman,以下是我正在使用的软件包及其版本: npm@7.6.3 node@13.9.0 mongodb@4.2.13-rc2 express@4.17.1 mongoose@5.12.12 validator@13.6.0 我正在建立一个用户注册页面。 在这里,我向你提出一个简单的发帖请求http://127.0.0.1:8000/users/registration'在我的“用户”路由器中。我有一个“用户”模式,其中声明了所有具有适当约束的路径。对于“用户”模型,在保存到“用户”集合之前,我正在使用“

以下是我正在使用的软件包及其版本:

npm@7.6.3 node@13.9.0 mongodb@4.2.13-rc2 express@4.17.1 mongoose@5.12.12 validator@13.6.0 我正在建立一个用户注册页面。 在这里,我向你提出一个简单的发帖请求http://127.0.0.1:8000/users/registration'在我的“用户”路由器中。我有一个“用户”模式,其中声明了所有具有适当约束的路径。对于“用户”模型,在保存到“用户”集合之前,我正在使用“.validate”函数验证该模型实例的数据。但在此之前,我还想验证单个路径/字段,其中“email”用于检查数据库中是否存在电子邮件,而“username”用于检查数据库中是否存在用户名,以及用户使用AJAX分别在注册表中键入电子邮件和用户名时的用户名建议。 通过将“路径名称”数组作为参数传递,可以使用相同的“.validate”函数实现特定的路径验证。 在我的例子中,'.validate['email']'和'.validate['username']'。 这工作非常好!。。。。。。。。。。。。。。。。。直到我面对这个不寻常的问题

为了解决这个特殊的问题,我只处理一个领域,即“电子邮件”。我正在使用“邮递员”发送邮寄请求。您可以使用任何其他软件,也可以创建HTML表单。 这里我只验证“电子邮件”字段。如果验证失败

情景1: 如果“电子邮件”字段值为空 如果“age”字段值为空或包含整数值,则返回json为空

{
    "email": "Email is required"
}
{
    "email": "'email' is not a valid email"
}
{
    "age": "Age should be a number",
    "email": "'email' is not a valid email"
}
情景2: 如果“电子邮件”字段具有无效的电子邮件值 如果“age”字段值为空或包含数值,则返回json为空

{
    "email": "Email is required"
}
{
    "email": "'email' is not a valid email"
}
{
    "age": "Age should be a number",
    "email": "'email' is not a valid email"
}
情景3: 如果“电子邮件”字段值为空或电子邮件值无效 如果“age”字段值包含非数字值,则返回的json为

{
    "email": "Email is required"
}
{
    "email": "'email' is not a valid email"
}
{
    "age": "Age should be a number",
    "email": "'email' is not a valid email"
}
场景1和场景2的结果正常,如预期。但对于场景3,这根本不是预期的结果,因为我只是在验证“电子邮件”路径/字段。我所观察到的是,模式中“年龄”路径的cast验证正在包括在我的验证中。如果我将此“年龄”路径的“type:Number”更改为“type:String”,则此问题不会发生。但是,我需要保留“type:Number”

那么这里的问题到底是什么。。。?? 我对Node.js平台非常陌生。您的宝贵建议非常值得赞赏

我正在验证我单独试验的源代码,以找出问题所在。请检查代码。您还可以运行代码以查看结果

只需在MongoDB中创建一个名为“mydb”的数据库和一个名为“users”的集合

文件夹结构:

计划/ -模型/ user.js -路线/ users.js index.js db_connect.js

这是我在“project/”文件夹中的index.js文件

const express = require('express');
const path = require('path');

const app = express();

// --------- Connecting to MongoDB server using Mongoose -------- //
require('./db_connect');
// ----------------------------- X ------------------------------ //

// -------------------- Application wise use ------------------ //
app.use(express.json());
app.use(express.urlencoded({extended: true}));
// ------------------------------ X --------------------------- //

// ########################## Routes ############################ //
// ------------ Including different routers ---------------- //
app.use('/users', require('./routes/users')); // User Route
// -------------------------- X ---------------------------- //

app.get(['/', '/index'], (req, res) => {
    console.log("Welcome my World!");
    res.send("Welcome my World!");
});
// ############################### X ################################# //

// --------------------- Server connection ------------------- //
const host = '127.0.0.1';
const port = process.env.PORT || 8000;

app.listen(port, host, function(err) {
    if( err )
    {
        console.error("Error in starting the Server");
    }
    
    console.log(`Server is running at ${host}:${port}`, Date.now());
});
// ---------------------------- X --------------------------- //
const mongoose = require('mongoose');

const dbEngine = 'mongodb';
const host = '127.0.0.1';
const port = 27017;
const username = '';
const password = '';
const dbName = 'mydb';

const credential = `${username || username && password ? `${username}:${password}@` : ''}`;
const connectionString = `${dbEngine}://${credential}${host}:${port}/${dbName}`;
const connectionOptions = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true
};

mongoose.connect(connectionString, connectionOptions)
.then(() => {
    console.log('MongoDB database connected successfully');
})
.catch(err => {
    console.error('Error in database connection', err);
    process.exit();
});

mongoose.connection.on('error', err => {
    console.error(err);
});

module.exports = mongoose;
这是我在“project/”文件夹中的db_connect.js文件

const express = require('express');
const path = require('path');

const app = express();

// --------- Connecting to MongoDB server using Mongoose -------- //
require('./db_connect');
// ----------------------------- X ------------------------------ //

// -------------------- Application wise use ------------------ //
app.use(express.json());
app.use(express.urlencoded({extended: true}));
// ------------------------------ X --------------------------- //

// ########################## Routes ############################ //
// ------------ Including different routers ---------------- //
app.use('/users', require('./routes/users')); // User Route
// -------------------------- X ---------------------------- //

app.get(['/', '/index'], (req, res) => {
    console.log("Welcome my World!");
    res.send("Welcome my World!");
});
// ############################### X ################################# //

// --------------------- Server connection ------------------- //
const host = '127.0.0.1';
const port = process.env.PORT || 8000;

app.listen(port, host, function(err) {
    if( err )
    {
        console.error("Error in starting the Server");
    }
    
    console.log(`Server is running at ${host}:${port}`, Date.now());
});
// ---------------------------- X --------------------------- //
const mongoose = require('mongoose');

const dbEngine = 'mongodb';
const host = '127.0.0.1';
const port = 27017;
const username = '';
const password = '';
const dbName = 'mydb';

const credential = `${username || username && password ? `${username}:${password}@` : ''}`;
const connectionString = `${dbEngine}://${credential}${host}:${port}/${dbName}`;
const connectionOptions = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true
};

mongoose.connect(connectionString, connectionOptions)
.then(() => {
    console.log('MongoDB database connected successfully');
})
.catch(err => {
    console.error('Error in database connection', err);
    process.exit();
});

mongoose.connection.on('error', err => {
    console.error(err);
});

module.exports = mongoose;
这是“project/models/”文件夹中的my user.js模型

const mongoose = require("mongoose");
const validator = require("validator");

let userSchema = new mongoose.Schema({
    f_name: {
        type: String,
        required: [true, "First name is required"],
        trim: true
    },
    l_name: {
        type: String,
        trim: true
    },
    age: {
        type: Number,
        cast: "Age should be a number",
        required: [true, "Age is required"],
        min: [18,"Age must be 18 years and above"],
        max: [100,"Maximum age limit is 100"]
    },
    username: {
        type: String,
        required: [true, "Username is required"],
        trim: true,
        minlength: [6, "Username should be at least 4 characters long"]
    },
    email: {
        type: String,
        required: [true, "Email is required"],
        unique: true,
        lowercase: true,
        trim: true,
        validate: {
            validator: (value) => {
                return validator.isEmail(value);
            },
            message: (prop) => `'${prop.value}' is not a valid email`
        }
    },
    password: {
        type: String,
        required: [true, "Password is required"],
        trim: true,
        minlength: [6, "Password length must be at least 6 characters long"]
    },
    is_admin: {
        type: Boolean,
        default: false
    },
    is_active: {
        type: Boolean,
        default: true
    },
    is_deleted: {
        type: Boolean,
        default: false
    }/*,
    // This field is added later for experimenting with this problem. You can uncomment this to check
    // the result. Just add a field 'xyz' in the 'HTML Form' or in the 'Postman'. Try experiment with different values
    xyz: {
        type: Number,
        cast: "Xyz should be a number",
        required: [true, "Xyz is required"],
        min: [10,"Must be 10 and above"],
        max: [100,"Maximum upper limit is 100"]
    }
    // ---------------------------------- X ---------------------------------- //
    */
},
{
    timestamps: {
        createdAt: 'created',
        updatedAt: 'updated'
    }
});

userSchema.virtual('full_name').get(function() {
    return this.f_name + " " + this.l_name;
});

// Format Schema error object into a user friendy error message format
userSchema.methods.getSchemaValidationMessages = (schemaErr) => {
    
    let objErr = {}, errors = schemaErr.errors;

    for( let prop in errors )
    {
        objErr[prop] = errors[prop].message;
    }

    return objErr;
}

module.exports = mongoose.model('User', userSchema);
    const express = require('express');
    const router = express.Router();

    const UserModel = require('../models/user');

    router.route('/registration')
    .post(async (req, res) => {
        let oUserModel = new UserModel(req.body);
        console.info(oUserModel);
    
        let objErr = null;
        try
        {
            objErr = await oUserModel.validate(['email']); // Validating a particular field
            // objErr = oUserModel.getSchemaValidationMessages(objErr);
            console.log('Result:', objErr);
        }
        catch(err)
        {
            objErr = oUserModel.getSchemaValidationMessages(err);
            console.error('Catch error:', objErr);
        }
        
        res.json(objErr);
    });
这是“project/routes/”文件夹中的my users.js路由器

const mongoose = require("mongoose");
const validator = require("validator");

let userSchema = new mongoose.Schema({
    f_name: {
        type: String,
        required: [true, "First name is required"],
        trim: true
    },
    l_name: {
        type: String,
        trim: true
    },
    age: {
        type: Number,
        cast: "Age should be a number",
        required: [true, "Age is required"],
        min: [18,"Age must be 18 years and above"],
        max: [100,"Maximum age limit is 100"]
    },
    username: {
        type: String,
        required: [true, "Username is required"],
        trim: true,
        minlength: [6, "Username should be at least 4 characters long"]
    },
    email: {
        type: String,
        required: [true, "Email is required"],
        unique: true,
        lowercase: true,
        trim: true,
        validate: {
            validator: (value) => {
                return validator.isEmail(value);
            },
            message: (prop) => `'${prop.value}' is not a valid email`
        }
    },
    password: {
        type: String,
        required: [true, "Password is required"],
        trim: true,
        minlength: [6, "Password length must be at least 6 characters long"]
    },
    is_admin: {
        type: Boolean,
        default: false
    },
    is_active: {
        type: Boolean,
        default: true
    },
    is_deleted: {
        type: Boolean,
        default: false
    }/*,
    // This field is added later for experimenting with this problem. You can uncomment this to check
    // the result. Just add a field 'xyz' in the 'HTML Form' or in the 'Postman'. Try experiment with different values
    xyz: {
        type: Number,
        cast: "Xyz should be a number",
        required: [true, "Xyz is required"],
        min: [10,"Must be 10 and above"],
        max: [100,"Maximum upper limit is 100"]
    }
    // ---------------------------------- X ---------------------------------- //
    */
},
{
    timestamps: {
        createdAt: 'created',
        updatedAt: 'updated'
    }
});

userSchema.virtual('full_name').get(function() {
    return this.f_name + " " + this.l_name;
});

// Format Schema error object into a user friendy error message format
userSchema.methods.getSchemaValidationMessages = (schemaErr) => {
    
    let objErr = {}, errors = schemaErr.errors;

    for( let prop in errors )
    {
        objErr[prop] = errors[prop].message;
    }

    return objErr;
}

module.exports = mongoose.model('User', userSchema);
    const express = require('express');
    const router = express.Router();

    const UserModel = require('../models/user');

    router.route('/registration')
    .post(async (req, res) => {
        let oUserModel = new UserModel(req.body);
        console.info(oUserModel);
    
        let objErr = null;
        try
        {
            objErr = await oUserModel.validate(['email']); // Validating a particular field
            // objErr = oUserModel.getSchemaValidationMessages(objErr);
            console.log('Result:', objErr);
        }
        catch(err)
        {
            objErr = oUserModel.getSchemaValidationMessages(err);
            console.error('Catch error:', objErr);
        }
        
        res.json(objErr);
    });

也许试着集中你的问题。。。这有点太多了:这也许能回答你的问题吗在运行验证程序之前,Mongoose会尝试将值强制为正确的类型。。。如果给定路径的强制转换失败,error.errors对象将包含一个CastError对象。