از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
اعتبارسنجی دادههای فرم در Node.js با express-validator انجام اعتبارسنجی سمت سرور هنگام ساخت برنامهها – بهویژه برنامههای رو به مشتری – ضروری است. دلیل آن این است که هرگز نمی توان به آن اعتماد کرد روی ورودی کاربر به تنهایی؛ زیرا گاهی اوقات این ورودی ها حاوی داده های جعلی/مخرب هستند. اعتبار سنجی سمت مشتری یک راه عالی برای بررسی بیشتر ورودی ها است، اما…
سرفصلهای مطلب
معرفی
انجام اعتبارسنجی سمت سرور هنگام ساخت برنامهها – بهویژه برنامههای رو به مشتری – ضروری است. دلیل آن این است که هرگز نمی توان به آن اعتماد کرد روی ورودی کاربر به تنهایی؛ زیرا گاهی اوقات این ورودی ها حاوی داده های جعلی/مخرب هستند.
اعتبار سنجی سمت کلاینت یک راه عالی برای بررسی بیشتر ورودی ها است، اما همچنان باید اعتبار سنجی سمت سرور را نیز انجام دهید.
راههای زیادی برای اعتبارسنجی دادهها در Node.js وجود دارد که در این مقاله نگاهی به آنها خواهیم داشت اعتبار سنجی سریع. Express-validator یک کتابخانه است که در اطراف پیچیده است validator.js
و کارکردهای خود را به عنوان مجموعه ای از میان افزارها آشکار می کند.
راه اندازی پروژه
برای این آموزش، ما یک سرور باطن دمو برای مسخره کردن ثبت نام کاربر و ورود به سیستم با Node.js خواهیم ساخت. این فیلدها قوانین خاصی را اعمال می کنند و ما داده هایی را که از طریق آنها ارائه می شود تأیید می کنیم.
لطفاً توجه داشته باشید که ما با منطق واقعی ثبت نام کاربر و ورود به سیستم یعنی ذخیره دادههای کاربر و اجرای احراز هویت کار نمیکنیم زیرا این موضوع خارج از محدوده این مقاله است.
برای شروع، ما یک پوشه پروژه ایجاد می کنیم، در آن حرکت می کنیم و آن را مقداردهی اولیه می کنیم:
# Create the project folder
$ mkdir express-validator-tut
# Navigate into the project folder
$ cd express-validator-tut
# Initialize project
$ yarn init -y
# OR
$ npm init -y
پس از اتمام، وابستگی های زیر را با اجرای دستور زیر نصب می کنیم:
$ yarn add body-parser express express-validator
# OR
$ npm i body-parser express express-validator
بیایید نگاهی به آنچه نصب کرده ایم بیندازیم:
- بیان: یک چارچوب نرم افزاری وب سبک برای Node.js. ما از این برای مدیریت مسیریابی در سرور باطن خود استفاده خواهیم کرد.
- تجزیه کننده بدن: میان افزاری که به ما کمک می کند ورودی های درخواست ورودی (ورودی های کاربر) را تجزیه کنیم
req.body
هدف – شی. - Express-validator: کتابخانه ای که ما از آن برای رسیدگی به اعتبارسنجی ورودی ورودی استفاده خواهیم کرد.
در نهایت، ما یک را ایجاد خواهیم کرد index.js
فایل در دایرکتوری پروژه ما به host کد دیگ بخار برای نمونه سازی یک برنامه/سرور Express:
// index.js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const port = 2022;
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.post('/register', (req, res) => {});
app.listen(port);
console.log('See where it all happens at http://localhost:'+port);
حالا بیایید این برنامه را با آن اجرا کنیم node
:
$ node index.js
اگر همه چیز خوب پیش رفت، شما terminal باید چیزی در امتداد خطوط خروجی:
قوانین اعتبارسنجی استاندارد با express-validator
در این بخش، روش افزودن قوانین اعتبارسنجی و پاکسازی ساده به درخواستهای دریافتی را یاد خواهیم گرفت. ابتدا، میخواهیم بررسی کنیم که آیا مقدار ورودی در فیلد ایمیل یک ایمیل معتبر است یا خیر. سپس، ما می خواهیم اعمال کنیم که رمز عبور حداقل 6 کاراکتر داشته باشد.
برای شروع، اجازه دهید چند توابع میانافزار را به ما اضافه کنیم /login
مسیر:
// index.js
...
const { body, validationResult } = require('express-validator');
app.post('/login',
body('email').isEmail().normalizeEmail(),
body('password').isLength({
min: 6
}),
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
success: false,
errors: errors.array()
});
}
res.status(200).json({
success: true,
message: 'Login successful',
})
});
...
در قطعه بالا، ما از دو روش اعتبار سنجی استفاده می کنیم:
isEmail()
: این تابع اعتبارسنجی بررسی می کند که آیا رشته ورودی یک آدرس ایمیل معتبر است یا خیر.isLength()
: این اعتبار سنج بررسی می کند که آیا طول یک رشته در یک محدوده مشخص قرار می گیرد یا خیر. در مورد ما، محدوده مشخص شده حداقل 6 کاراکتر است.
برخی از روش های دیگری که می توانستیم استفاده کنیم عبارتند از:
isNumeric()
– بررسی می کند که آیا ورودی عددی است یا خیرcontains()
– بررسی می کند که آیا ورودی دارای مقدار خاصی است یا خیرisBoolean()
– بررسی کنید که ورودی یک مقدار بولی استisCurrency()
– بررسی می کند که آیا ورودی با قالب ارزی است یا خیرisJSON()
– بررسی می کند که آیا ورودی JSON است یا خیرisMobilePhone()
– چک این است که ورودی یک شماره تلفن همراه معتبر استisPostalCode()
– بررسی می کند که آیا ورودی یک کد پستی معتبر است یا خیرisBefore()
وisAfter()
– بررسی می کند که آیا تاریخ قبل یا بعد از تاریخ دیگری است
موارد دیگری نیز وجود دارد، اما اینها احتمالاً مواردی هستند که بیشتر نیازهای اعتبارسنجی شما را پوشش می دهند.
برای اطمینان از اینکه آدرس های ایمیل ارائه شده توسط کاربر فاقد نویز و بی نظمی است، همانطور که در قطعه بالا مشاهده می شود، یک ضدعفونی کننده به فیلد ایمیل خود اضافه می کنیم. این normalizeEmail()
این روش به تبدیل ایمیل های وارد شده به فرمت استاندارد تایید شده کمک می کند. این بدان معناست که اگر کاربر وارد شود، برای مثال، (email protected)
، به متعارف می شود (email protected)
.
Validator.js برخی از انعطافپذیریها را ارائه میدهد، زیرا این گزینه قابل تغییر است off
یا روی
اما تنظیم شده است روی
به صورت پیش فرض. مجموعه ای از گزینه ها برای عادی سازی وجود دارد که اگر قصد دارید آنها را بررسی کنید روی عادی سازی ورودی اگر میخواهید درباره سایر عملکردهای اعتبارسنجی/ضدعفونیکننده بیشتر بخوانید، میتوانید Validator.js را بررسی کنید. اسناد رسمی.
بیایید با ارسال درخواستی با رمز عبور نامعتبر، کد خود را آزمایش کنیم و الف @googleemail.com
ایمیل، با استفاده از پستچی یا curl
:
تا اینجا، نگاهی به این موضوع انداختیم که چگونه میتوانیم ورودیهای ورودی را برای یک نقطه پایانی ورود نمونه تأیید کنیم. بیایید اکنون به نقطه پایانی ثبت نام برویم و وظایفی مانند قوانین اعتبار سنجی سفارشی، پیام های خطا، اعتبارسنجی طرح و استانداردسازی پیام های اعتبار سنجی را پوشش دهیم.
قوانین اعتبار سنجی سفارشی و پیام های خطا با express-validator
برای شروع، اجازه دهید نقطه پایانی ثبت نام کاربر خود را با افزودن قطعه زیر به ما ایجاد کنیم index.js
فایل:
// index.js
...
app.post('/register', (req, res) => {
// Validate incoming input
res.status(200).json({
success: true,
message: 'Registration successful',
});
});
...
سفارشی() روش
برای اطمینان از اینکه کاربران ما در هنگام ثبت نام نامهای کاربری منحصر به فردی را وارد میکنند، نمیتوانیم از روشهای استاندارد پیچیدهشده از متدهای Validator.js استفاده کنیم، زیرا هیچ روشی برای بررسی آن وجود ندارد.
برای این کار باید یک اعتبارسنجی سفارشی بنویسیم که با استفاده از custom()
روش. این custom()
متد تابعی را می پذیرد که به علاوه می تواند همگام باشد. اگر تابع ناهمگام باشد، میخواهید در صورت عدم موفقیت اعتبار، قول را رد کنید و یک پیام سفارشی را مشخص کنید. اگر نه، می توانید یک استثنا بیندازید.
بیایید ابتدا با رد یک قول شروع کنیم:
// index.js
...
app.post('/register',
body("username").custom(value => {
return User.find({
username: value
}).then(user => {
if (user.length > 0) {
// Custom error message and reject
// the promise
return Promise.reject('Username already in use');
}
});
}),
(req, res) => {
// Validate incoming input
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array()
});
}
...
})
در قطعه کد بالا، ما در حال فراخوانی هستیم find()
روش روی طرحواره کاربر مدل Mongoose برای بررسی اینکه آیا نام کاربری وارد شده توسط مشتری از قبل در پایگاه داده ما وجود دارد یا خیر.
اگر وجود داشته باشد، با پیامی که میخواهیم به کاربر برگردانیم، قول را رد میکنیم.
اگر چه اگر فیلد نام کاربری در هنگام تعیین طرح پایگاه داده منحصربهفرد علامتگذاری شود، MongoDB بهطور خودکار این موضوع را تشخیص میدهد. توصیه می شود قبل از اینکه به DB برسد، این کار را انجام دهید تا برنامه ما پیش از موعد خراب نشود.
از طرف دیگر، می توانید یک استثنا به عنوان راهی برای نشان دادن ورودی نامعتبر ایجاد کنید:
// index.js
...
app.post('/register',
body("username").custom(value => {
return User.find({
username: value
}).then(user => {
if (user.length > 0) {
throw ("Username is taken!"); //custom error message
}
});
}),
...
withMessage() روش
راه دوم برای پیاده سازی پیام های خطای اعتبارسنجی سفارشی استفاده از withMessage()
زنجیر. شما می توانید تعدادی اعتبار سنج و به دنبال آن قرار دهید withMessage()
روش های زنجیره ای برای تعیین پیام های خطا برای هر اعتبارسنجی:
body("parameter")
.validator1()
.withMessage('Message 1')
.validator2()
.withMessage('Message 2')
بیایید این را با روش های واقعی در مثال خود اعمال کنیم:
// index.js
...
app.post('/register',
body("password").isStrongPassword({
minLength: 8,
minLowercase: 1,
minUppercase: 1,
minNumbers: 1
})
.withMessage("Password must be greater than 8 and contain at least one uppercase letter, one lowercase letter, and one number"),
(req, res) => {
// Validate incoming input
})
...
بیایید یک درخواست دیگر با یک رمز عبور نامعتبر و یک نام کاربری که قبلاً در حال استفاده است، ارائه دهیم:
اعتبار سنجی طرحواره با express-validator
اعتبار سنجی طرحواره یک رویکرد تمیزتر برای اعتبارسنجی داده ها ارائه می دهد. به جای فراخوانی توابع متعدد، قوانین اعتبار سنجی را برای هر فیلد مشخص می کنیم و طرحواره را به یک تابع میان افزار منفرد به نام منتقل می کنیم. checkSchema()
.
در قطعه زیر، یک طرح اعتبارسنجی برای نقطه پایانی ثبت نام کاربر ایجاد خواهیم کرد:
// index.js
...
const {body, checkSchema, validationResult} = require('express-validator');
const registrationSchema = {
username: {
custom: {
options: value => {
return User.find({
username: value
}).then(user => {
if (user.length > 0) {
return Promise.reject('Username already in use')
}
})
}
}
},
gender: {
notEmpty: true,
errorMessage: "Gender field cannot be empty"
},
password: {
isStrongPassword: {
minLength: 8,
minLowercase: 1,
minUppercase: 1,
minNumbers: 1
},
errorMessage: "Password must be greater than 8 and contain at least one uppercase letter, one lowercase letter, and one number",
},
phone: {
notEmpty: true,
errorMessage: "Phone number cannot be empty"
},
email: {
normalizeEmail: true,
custom: {
options: value => {
return User.find({
email: value
}).then(user => {
if (user.length > 0) {
return Promise.reject('Email address already taken')
}
})
}
}
}
}
...
با مشخص کردن یک طرح، میتوانیم فیلدهای ورودی خاص را برای اعمال اعتبارسنجیها و ضدعفونیکنندهها بررسی کنیم، و بسیار خواناتر از زنجیرهای کردن بسیاری از روشها با پیامهای اعتبارسنجی است که در بخشهای قبلی دیدیم.
حالا، ما می توانیم جلو برویم و از این استفاده کنیم checkSchema()
برای تایید داده ها روی ثبت:
app.post('/signup', checkSchema(registrationSchema), (req, res) => {
// Validate incoming input
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array()
});
}
res.status(200).json({
success: true,
message: 'Registration successful',
});
})
اگر فقط به مقدار کمی اعتبار نیاز دارید و می خواهید آن را ساده نگه دارید، می توانید از روش ها استفاده کنید. اگر مقدار زیادی از اعتبارسنجیها را باید انجام دهید، اگر از اعتبارسنجی طرحواره استفاده کنید، خواناتر خواهد بود.
استاندارد کردن پاسخ های اعتبارسنجی با Express-validator
express-validator
استاندارد کردن پاسخهای خطای اعتبارسنجی را ممکن میسازد. این بدان معناست که شما می توانید توابع میان افزار خود را برای اجرای اعتبارسنجی و مدیریت خطاهای اعتبار سنجی ایجاد کنید.
نمونه ای از اینکه چگونه می توان این کار را انجام داد، ایجاد یک است validate()
تابعی که تمام اعتبار سنجی های ما را می پذیرد و آنها را با استفاده موازی اجرا می کند Promise.all()
:
// index.js
const validate = validations => {
return async (req, res, next) => {
await Promise.all(validations.map(validation => validation.run(req)));
const errors = validationResult(req);
if (errors.isEmpty()) {
return next();
}
res.status(400).json({
errors: errors.array()
});
};
};
اکنون تابع اعتبارسنجی ما ایجاد شده است که می توانیم دوباره از آن استفاده کنیم روی مسیرهای متعدد بیایید آن را در مسیرهای ورود و ثبت نام خود اعمال کنیم:
// index.js
...
app.post('/login', validate((
body('email').isEmail().normalizeEmail(),
body('password').isLength({
min: 12
})
)),
(req, res) => {
// Process data
res.status(200).json({
success: true,
message: 'Login successful',
})
});
app.post('/register', validate(checkSchema(registrationSchema)), (req, res) => {
// Process data
res.status(200).json({
success: true,
message: 'Registration successful',
});
});
...
همانطور که در قطعه بالا مشاهده می شود – استفاده از یک میان افزار اعتبار سنجی سفارشی که تمام اعتبار سنجی ها و ضد عفونی کننده های ما را اجرا می کند، نه تنها عملکرد را با Promise.all()
تماس بگیرید، اما همچنین میتوانیم خوانایی کد را بهبود ببخشیم. این زمانی مفید خواهد بود که ما نیاز به اعتبارسنجی تعداد زیادی فیلد فرم داشته باشیم.
نتیجه
در این مقاله، ما به استفاده اولیه و پیشرفته تر از آن پرداخته ایم express-validator
، یک کتابخانه بزرگ سبک وزن که در اطراف شناخته شده است validator.js
کتابخانه
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-17 12:55:03