簡體   English   中英

如何使用 if 語句執行用戶輸入驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM