אבטח את היישומים שלך על ידי אימות נתונים ברמת הבקשה באמצעות ספריית האימות של Joi.

קבלת נתונים לא בדוקים ולא מאומתים ליישום אינטרנט עלולה לגרום לפרצות אבטחה, ובעיות בלתי צפויות עלולות להיווצר מהנתונים הלא חוקיים.

Node.js ORMs, כגון Sequelize ו- TypeORM, מאפשרים לך להגדיר כללי אימות מהקופסה ברמת היישום. במהלך פיתוח API, הנתונים מגיעים מבקשות HTTP לנקודות קצה ספציפיות. זה קורה ברמת הבקשה; לפיכך, אימות ברירת המחדל המוצע על ידי ה-ORMs אינו חל עליהם.

Joi הוא תיאור סכימה ומאמת נתונים עבור JavaScript. כאן תלמד כיצד להשתמש בספריית האימות של Joi כדי לאמת נתונים ברמת הבקשה.

הגדרת פרויקט הדגמה

כדי להדגים איך ג'וי מאמת נתונים, תבנה אפליקציית הדגמה פשוטה המחקה אפליקציה בפועל.

ראשית, צור תיקיית פרויקט ועבר אליה על ידי הפעלת הפקודה הבאה:

mkdir demoapp && cd demoapp

לאחר מכן, אתחל את npm בספריית הפרויקט שלך על ידי הפעלת:

npm init -y

לאחר מכן, תצטרך להתקין כמה תלות. התלות הנדרשת למדריך זה כוללות את הדברים הבאים:

  • אֶקְסְפּרֶס: Express היא מסגרת Node.js המספק קבוצה חזקה של תכונות עבור יישומי אינטרנט וניידים. Express מקל על בניית יישומי backend עם Node.js.
  • ג'וי: Joi היא ספריית אימות נתונים עבור Node.js.
instagram viewer

התקן את התלות עם מנהל חבילות הצומת על ידי הפעלת הפקודה למטה:

npm להתקין express joi

לאחר מכן, צור index.js קובץ בספריית השורש שלך והוסף אליו את בלוק הקוד הבא:

const express = לִדרוֹשׁ("אֶקְסְפּרֶס");
const נתב = לִדרוֹשׁ("./מסלולים");
const יציאה = 3000;

const app = express();

app.use (express.json());
app.use (express.urlencoded({ מורחב: נָכוֹן }));
app.use (נתב);

app.listen (פורט, () => {
לְנַחֵם.עֵץ("האזנה לאפליקציה ביציאה 3000!");
});

בלוק הקוד למעלה מגדיר שרת אקספרס פשוט. הוא מגדיר את התוכנה לנתח נתוני בקשות נכנסות ולטפל בבקשות נכנסות ומתחיל את השרת להאזין לבקשות נכנסות ביציאה 3000.

ניתוב וטיפול בבקשות

לשם הפשטות, תיצור מתווך למטפל בקשות המחזיר קוד סטטוס, יחד עם גוף הבקשה, כמענה לכל בקשה שמנסה לשלוח נתונים לאפליקציה שלך.

ליצור handler.js קובץ בספריית השורש של הפרויקט שלך והוסף את בלוק הקוד למטה:

const demoHandler = (req, res, next) => {
res.send({
קוד: 201,
נתונים: req.body,
});
הַבָּא();
};

מודול.exports = demoHandler;

לאחר מכן, צור א router.js קובץ בספריית השורש של הפרויקט שלך והוסף את בלוק הקוד למטה לקובץ שלך:

const express = לִדרוֹשׁ("אֶקְסְפּרֶס");
const demoHandler = לִדרוֹשׁ("./handler");
const נתב = אקספרס. נתב();

router.post("/הירשם", demoHandler);

מודול.exports = נתב;

יצירת סכמת Joi

סכימת Joi מייצגת את המבנה ואת כללי האימות הצפוי של אובייקט נתונים ספציפי.

כדי ליצור סכימת Joi, אתה יכול להשתמש ב- Joi.object() שיטה ושרשרת כללי אימות שונים שנחשפו על ידי Joi כדי להגדיר את המבנה ודרישות האימות לנתונים שלך.

לדוגמה:

const exampleSchema = Joi.object({
שם: Joi.string().min(3).נדרש(),
});

הדוגמה למעלה מתארת ​​סכימת Joi פשוטה עם a שֵׁם תכונה. ה שֵׁם לנכס יש ערך של Joi.string().min (3).required(). זה אומר שה שֵׁם הערך צריך להיות מחרוזת, באורך מינימלי של 3 תווים, והוא חובה.

באמצעות Joi, אתה יכול לשרשר שיטות שונות כדי להוסיף אילוצי אימות נוספים לכל שדה שהוגדר בסכימה שלך.

הנה דוגמה עם עוד שדות ואילוצי אימות:

const userSchema = Joi.object({
דוא"ל: Joi.string().email().required(),

סיסמה: Joi.string().min(6).נדרש(),

age: Joi.number().min(18).אופציונאלי(),

מועסק: Joi.boolean().optional(),

טלפון: Joi.string()
‎.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.נדרש(),

כתובת: Joi.object({
street: Joi.string().min(3).נדרש(),
עיר: Joi.string().min(3).נדרש(),
state: Joi.string().min(3).נדרש(),
zip: Joi.number().min(3).נדרש(),
}).נדרש(),

 תחביבים: Joi.array().items (Joi.string()).required(),

}).אפשרויות({ להפסיק מוקדם: שֶׁקֶר });

ה userSchema מגדיר את האילוצים הבאים עבור כל מאפיין:

  • אימייל: חייבת להיות מחרוזת אימייל חוקית.
  • סיסמה: חייבת להיות מחרוזת עם מינימום של 6 תווים.
  • גיל: מספר אופציונלי עם ערך מינימלי של 18.
  • מוּעֳסָק: בוליאני אופציונלי.
  • טלפון: מחרוזת נדרשת התואמת למצוין ביטוי רגולרי (/^\d{3}-\d{3}-\d{4}$/).
  • כתובת: אובייקט המייצג את כתובת המשתמש עם מאפייני המשנה הבאים.
    • רְחוֹב: מחרוזת נדרשת באורך מינימלי של 3 תווים.
    • עִיר: מחרוזת נדרשת באורך מינימלי של 3 תווים.
    • מדינה: מחרוזת נדרשת באורך מינימלי של 3 תווים.
    • רוכסן: מספר נדרש עם ערך מינימלי של 3.
  • תחביבים: מערך נדרש של מחרוזות.

בנוסף לאילוצים, userSchema קובע את להפסיק מוקדם אפשרות ל שֶׁקֶר. כברירת מחדל, Joi מפסיקה את הפעלת התוכנית ברגע שהיא נתקלת בשגיאה הראשונה ומדפיסה את השגיאה למסוף. עם זאת, הגדרת אפשרות זו ל שֶׁקֶר מבטיח ש-Joi בודק את הסכימה כולה ומדפיס את כל השגיאות שנתקלו בקונסולה.

אימות נתונים עם Joi

ליצור validation.js קובץ והוסף את userSchema קוד אליו.

ככה:

//validation.js
const ג'וי = לִדרוֹשׁ("ג'וי");

const userSchema = Joi.object({
//...
}).אפשרויות({ להפסיק מוקדם: שֶׁקֶר });

מודול.exports = userSchema;

לאחר מכן, צור תוכנת ביניים שיירטת עומסי בקשות ומאמתת אותן מול סכימה שסופקה על ידי הוספת הקוד הבא מתחת ל- userSchema קוד.

const validationMiddleware = (סכֵימָה) => {
לַחֲזוֹר(req, res, next) => {
const { error } = schema.validate (req.body);

אם (שגיאה) {
// טיפול בשגיאת אימות
לְנַחֵם.log (error.message);

res.status(400).json({ שגיאות: פרטי שגיאה });
} אַחֵר {
// הנתונים תקפים, המשך לתווך הבא
הַבָּא();
}
};
};

כאשר מתקבלת בקשה, תוכנת האמצע מפעילה את לְאַמֵת שיטת ה סכֵימָה לאמת את גוף הבקשה. אם מתרחשות שגיאות אימות כלשהן, תוכנת התווך שולחת א בקשה שגויה 400 תגובה עם הודעות השגיאה שחולצו מפרטי שגיאת האימות.

מצד שני, אם האימות עובר ללא שגיאות, התוכנה קוראת ל- הַבָּא() פוּנקצִיָה.

לבסוף, ייצא את ה validationMiddleware ו userSchema.

מודול‎.exports = {
userSchema,
validationMiddleware,
};

בדיקת אילוצי אימות

יְבוּא validationMiddleware ו userSchema לתוך שלך router.js קובץ והגדר את תוכנת האמצע כך:

const { validationMiddleware, userSchema } = לִדרוֹשׁ("./מַתַן תוֹקֵף");

router.post("/הירשם", validationMiddleware (userSchema), demoHandler);

התחל את היישום שלך על ידי הפעלת הפקודה למטה:

צוֹמֶתאינדקס.js

לאחר מכן, בצע בקשת HTTP POST אל מארח מקומי: 3000/הרשמה באמצעות נתוני הבדיקה שלהלן. אתה יכול להשיג זאת באמצעות cURL או כל לקוח API אחר.

{
"אימייל": "user@example", // פורמט דוא"ל לא חוקי
"סיסמה": "לַעֲבוֹר", // אורך סיסמה פחות מ-6 תווים
"גיל": 15, // גיל מתחת ל-18
"מוּעֳסָק": נָכוֹן,
"תחביבים": ["קריאה", "רץ"],
"טלפון": "123-456-789", // פורמט מספר טלפון לא חוקי
"כתובת": {
"רְחוֹב": "123",
"עִיר": "עיר לדוגמא",
"מדינה": "מדינה לדוגמה",
"רוכסן": 12345
}
}

בקשה זו תיכשל ותחזיר אובייקט שגיאה שכן המטען מכיל הרבה שדות לא חוקיים, כגון דואר אלקטרוני, סיסמה, גיל וטלפון. באמצעות אובייקט השגיאה שסופק, אתה יכול לטפל בשגיאות בצורה מתאימה.

פישוט אימות הנתונים עם Joi

כאן כיסת את רוב היסודות של אימות נתונים באמצעות Joi. עם זאת, אתה יכול לכסות טכניקות ואילוצים מתקדמות יותר בתיעוד של Joi.

Joi מפשטת את משימת אימות הנתונים ב-JavaScript, ומספקת פתרון אינטואיטיבי המשפר משמעותית את המהימנות והשלמות של הנתונים המאוחסנים באפליקציה שלך.