我正在嘗試使用 if 陳述句執行用戶驗證,但在使用郵遞員進行測驗時,即使添加了有效的電子郵件地址和無效的電子郵件地址,我仍然只收到第一個回傳陳述句“需要電子郵件”。我附上了用戶模型、用戶控制器邏輯和郵遞員回應的圖片
用戶模式模型
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;
用戶控制器.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);
}
}

uj5u.com熱心網友回復:
你的控制器不好。您需要從 req.body 中獲取電子郵件、姓氏和名字。
const {email, lastName} = req.body
然后進行驗證,順便說一句,這已經在貓鼬中發生了。
const email = await user.findOne({ email: req.body.email });
在這一行中,您正在資料庫中查找 email = req.body.email 的用戶。但是由于沒有這樣的用戶,它會回傳您的 if 陳述句
if (!email) return res.send('Email is required')
要獲得您的用戶,您只需要與一個值進行比較,如果您將它設定為在您的架構中是唯一的,而不是用戶電子郵件。
const user = await user.findOne({ email });
在這種情況下,電子郵件已經被破壞,如果沒有用戶,您可以創建一個。
您可以使用 await user.create() 并傳遞您的值并在架構中使用 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: {
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,
},
uj5u.com熱心網友回復:
您可以簡單地安裝驗證器包npm i validator,然后在用戶模型中呼叫它,const { isEmail } = require('validator');最后在您的架構中鍵入它,而不是在函式中硬編碼驗證碼。
email: { type: String, required: true, validate: [isEmail], unique: true },
uj5u.com熱心網友回復:
而不是撰寫自定義邏輯進行驗證請在執行安全檢查后添加驗證層
您可以使用Express 驗證器,以更流暢的方式執行所有驗證,它將消除不必要的邏輯和代碼行,并添加結構化代碼來驗證所有型別的輸入、嵌套物件、資料庫呼叫以進行現有資料處理。它將自行處理回應和回應訊息,而無需點擊控制器
剛打
npm install --save express-validator
并且您已準備好輕松有效地驗證請求
uj5u.com熱心網友回復:
除了其他答案之外,我認為缺少一件事,但它是 Node.JS 中非常強大的驗證方法是JOI包,您可以定義您的驗證模式并擺脫所有其他痛苦,如果和其他,示例如下
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: '[email protected]'
}
const result = Joi.validate(dataToValidate, schema);
// result.error == null means valid
如果沒有節點腳本,您始終可以在此網頁上測驗您的 JOI 模式和資料物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/504011.html
標籤:javascript 节点.js mongodb 验证 猫鼬
