[英]How to perform user-input validation using if statements
我正在嘗試使用 if 語句執行用戶驗證,但在使用郵遞員進行測試時,即使在添加了有效的 email 地址和無效的 email 地址之后,我仍然只獲得第一個返回語句“需要電子郵件”。 我附上了用戶 model、用戶 controller 邏輯和郵遞員回復的圖片
用戶模式 model
const mongoose = require('mongoose');
const { Schema } = mongoose
const userSchema = new Schema({
firstName: {
type: String,
required: true,
min: 3,
max: 20
},
lastName: {
type: String,
required: true,
min: 3,
max: 20
},
email: {
type: String,
required: true,
unique: true,
},
phoneNumber: {
type: String,
required: true,
},
password: {
type: String,
required: true,
min: 5
},
confirmPassword: {
type: String,
required: true,
min: 5
}
});
const User = mongoose.model('User', userSchema);
module.exports = User;
user.controller.js
module.exports.users = async(req, res) => {
try {
const email = await user.findOne({ email: req.body.email });
const firstName = await user.find({ firstName: req.body.firstName });
const lastName = await user.find({ lastName: req.body.lastName });
const password = await user.find({ password: req.body.password });
const confirmPassword = await user.find({ confirmPassword: req.body.confirmPassword });
const phoneNumber = await user.find({ phoneNumber: req.body.phoneNumber });
if (!email) return res.send('Email is required')
const filterEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (!filterEmail.test(email.value)) return
res.send('Please provide a valid email address');
if (email) return res.send('Email already exists');
if (!firstName) return res.send('First Name is required');
if (firstName.length < 3 || firstName.length > 20) return
res.send('First name must be at least 3 characters and less than 20 characters');;
if (!lastName) return res.send('Last Name is required');
if (lastName.length < 3 || lastName.length > 20) return
res.send('Last name must be at least 3 characters and less than 20 characters')
if (!password) return res.send('PassWord is required');
const filterPassword = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).{5,15}$/;
if (!filterPassword.test(password.value)) return
res.send('Password must include at least one lowercase letter, one uppercase letter, one digit, and one special character');
if (!confirmPassword) return res.send(' Please confirm password');
if (password.value !== confirmPassword.value) return res.send('Passwords do not match');
if (!phoneNumber) return res.send('Phone Number is required');
phone(phoneNumber.value);
let User = new user(_.pick(req.body, ['firstName', 'lastName', 'email', 'phoneNumber', 'password']));
bcrypt.genSalt(10, async(err, salt) => {
if (err) throw err;
return user.password = await bcrypt.hash(user.password, salt);
});
await User.save();
} catch (err) {
res.status(500).send('Something went wrong');
console.warn(err);
}
}
你的 controller 不好。 您需要從 req.body 獲取 email、lastName 和 firstName。
const {email, lastName} = req.body
然后進行驗證,順便說一句,這在 mongoose 中已經發生了。
const email = await user.findOne({ email: req.body.email });
在這一行中,您正在數據庫中查找具有 email = req.body.email 的用戶。 但是由於沒有這樣的用戶,它會返回您的 if 語句
if (!email) return res.send('Email is required')
要獲得您的用戶,您只需要與一個值進行比較,如果您將其設置為在您的架構中是唯一的,而不是用戶 email。
const user = await user.findOne({ email });
在這種情況下 email 已經被破壞,如果沒有用戶,您可以創建一個。
您可以使用 await user.create() 並在您的架構中傳遞您的值和 hash 密碼與 pre("save") 。
UserSchema.pre("save", async function () {
if (!this.isModified("password")) return;
const salt = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, salt);
});
您還可以在架構中驗證用戶 email
email: {
type: String,
required: [true, "Please provide email"],
match: [
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
"Please provide a valid email",
],
unique: true,
},
您可以簡單地安裝驗證器 package npm i validator
,然后在用戶 model const { isEmail } = require('validator');
中調用它最后在你的模式中輸入這個,而不是在 function 中硬編碼驗證碼。
email: { type: String, required: true, validate: [isEmail], unique: true },
而不是編寫自定義邏輯進行驗證請在執行安全檢查后添加驗證層
您可以使用Express 驗證器,以更流暢的方式執行所有驗證,它將消除不必要的邏輯和代碼行,並添加結構化代碼來驗證所有類型的輸入、嵌套對象、數據庫調用以進行現有數據處理。 它將自行處理響應和響應消息,而不會碰到 controller
剛打
npm install --save express-validator
並且您已准備好輕松有效地驗證請求
除了其他答案之外,我認為缺少一件事,但它在 Node.JS 中非常強大的驗證方法是JOI package,您可以定義您的驗證模式並擺脫所有其他痛苦,如果和其他,示例如下
const Joi = require('joi');
const schema = Joi.object().keys({
firstName: Joi.string().alphanum().min(3).max(20).required(),
lastName: Joi.string().alphanum().min(3).max(20).required(),
email: Joi.email().required(),
phoneNumber: Joi.string().length(10).pattern(/^[0-9]+$/).required(),
password: Joi.string().min(5).required(),
confirmPassword: Joi.any().valid(Joi.ref('password')).required()
});
const dataToValidate = {
firstName: 'chris',
lastName: 'John',
email: 'test@test.com'
}
const result = Joi.validate(dataToValidate, schema);
// result.error == null means valid
如果沒有節點腳本,您始終可以在此網頁上測試您的 JOI 模式和數據 object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.