קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
ראשי ♦ Javascript ♦ מדריך nodeJS Express – חלק 2 – controllers

מדריך nodeJS Express – חלק 2 – controllers

עידן יצחקי 5 בפברואר 2022 אין תגובות

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

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

בספרית controllers ניצור קובץ בשם login.js

const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");

const Login = require("../models/login");

exports.createUser = async (req, res, next) => {
    bcrypt.hash(req.body.password, 10).then(
        hash => {
            console.log(req);
            const user = new Login({
                firstName: req.body.firstName,
                lastName: req.body.lastName,
                email: req.body.email,
                password: hash,
            });
            user.save().then(result => {
                res.status(201).json({
                    massage: 'Login User created',
                    result: result
                });
            }).catch(err => {
                res.status(500).json({
                    message: "Invalid authentication credentials!!"
                });
            });
        }
    );
}
exports.userLogin = async (req, res, next) => {
    let fetchedUser;
    Login.findOne({ email: req.body.email }).then(user => {
        if (!user) {
            return res.status(401).json({
                message: "Auth failed",
            });
        }
        fetchedUser = user;
        return bcrypt.compare(req.body.password, user.password)
    })
        .then(result => {
            if (!result) {
                return res.status(401).json({
                    message: "Auth failed",
                });
            }
            const token = jwt.sign({ email: fetchedUser.email, userId: fetchedUser._id },
                process.env.JWT_KEY, { expiresIn: '1h' });
            res.status(200).json({
                token: token,
                expiresIn: 3600,
                userId: fetchedUser._id,
            })
        })
        .catch(err => {
            return res.status(401).json({
                message: "Auth failed",
            })
        })
}
exports.getUserInfo = async (req, res, next) => {
    Login.findById(req.params.id).then(info => {
        if (info) {
            const userInfo = {
                firstName: info.firstName,
                lastName: info.lastName,
                birthday: info.birthday ?? '',
            }
            res.status(200).json(userInfo);
        } else {
            res.status(404).json({ message: "Info not found!" });
        }
    }).catch(err => {
        res.status(500).json({ message: "Fetching info data failed" });
    });
}

שורה 1:

תוספת (יש צורך להתקין) שהתפקיד שלה הוא להצפין מידע

שורה 2:

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

בשורה 4:

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

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

במידה שכן ואין צורך לבצע שינוי במידע, נעביר את המידע כמו שהוא לכיוון השרת.

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

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

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

בכלליות:

פונקציה 1:

יוצרת משתמש חדש, שימו לב שאנחנו אף פעם לא שומרים את הסיסמה של המשתמש אלא מניפולציה של הסיסמה לאחר שהיא עברה דרך bcrypt.

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

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

פונקציה 2:

התחברות, עושים חיפוש למייל שהוא הכניס (שימו לב שהגדרנו את מודל שיכול להיות רק מייל אחד למשתמש אחד בבסיס הנתונים).

משווים את הסיסמה אחרי שהיא עברה במנגנון ה-bcrypt ואם הן שוות אז מחזירים תשובה למשתמש שהכל תקין (200), ובתשובה מחזירים את הטוקן שהוא קיבל, הזיהוי שלו, והזמן שהטוקן תקף.

אם לא תקין, אז מחזירים הודעת שגיאה.

פונקציה 3:

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

בחלק הבא נדבר על routes ואיך הם קשורים לקונטרולרים.

פוסטים קשורים:

מדריך nodeJS Express – חלק 4 – middleware מדריך nodeJS Express – חלק 3 – routes מדריך nodeJS Express – חלק 1 – models תמונת אווירה של דאטהאיך לשמור או לעדכן מערך של אובייקטים ב-mongoDb בשימוש nodeJs Express
express javascript nodejs מדריך

אודות המחבר

עידן יצחקי להציג את כל הפוסטים של עידן יצחקי


« פוסט קודם
פוסט הבא »

השארת תגובה

ביטול

חיפוש באתר
בחירת העורכים
29 בדצמבר 2023 עידן יצחקי

שדה טקסט עשיר עם תמונות

אתם הולכים להיות מופתעים עד כמה HTML יכול להיות חכם ולבצע משהו כל כך מורכב, שאם אנחנו היינו רוצים ליצור

1 באוקטובר 2021 עידן יצחקי

איך למשוך דינמית favicon של אתרים אחרים ב-JS

בפוסט זה נראה איך אפשר על פי לינקים בדף למשוך את ה-favicon מהדומיין שלהם באופן דינמי, בדיקה של תקינות התמונה

פופולרי
Javascript functions – היכרות עם סוגי פונקציות
Javascript
21 בדצמבר 2024 אין תגובות
Nested routing in angular standalone component
Typescript
15 בנובמבר 2024 תגובה אחת
בחרו לפי תגיות
angular blockchain css ethers express front-end fullstack GQL html javascript next js nextjs nodejs react hooks reactjs solidity webgl אנגולר בלוקציין וורדפרס לימודי אנגולר לימודי וורדפרס לימוד ריאקט מדריך front-end מדריך GQL מדריך אנגולר מדריך וורדפרס מדריך חינם react מדריך ריאקט מפתח בלוק מפתח בלוקציין מתכנת front-end מתכנת בלוקציין מתכנת פרונט סולידיטי קורס front end קורס fullstack קורס nextjs קורס אנגולר קורס בלוקציין קורס בלוקציין בחינם קורס סולידיטי קורס ריאקט קורס תכנות קורס תכנות בחינם
סינון על פי קטגוריות
CSS fullstack HTML IIS Javascript nodeJs SEO Typescript אנגולר בלוקציין בניית אתרים וורדפרס חיפוש עבודה כלים נוספים כללי נגישות קורסים ריאקט תלת מימד תקלות ופתרונות
צור קשר
כל הזכויות שמורות לקודקודייל
ליצירת קשר: @ קודקודייל
גלילה לראש העמוד