Javascript 在我的node.js应用程序中验证mongoose架构的单个路径/字段时遇到问题
以下是我正在使用的软件包及其版本: 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为空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'在我的“用户”路由器中。我有一个“用户”模式,其中声明了所有具有适当约束的路径。对于“用户”模型,在保存到“用户”集合之前,我正在使用“
{
"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对象。