קורס Node.JS שיעור תרגול היכרות עם Node.JS


זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/nodejs/lessons/06-hello-node-lab

יש תשובות לתרגילים שבפרק זה?

הי @ester1,
באופן גורף באתר יש בכל קורס שיעורים מ-3 סוגים: יש שיעורי וידאו תיאורטיים שמסבירים נושא, יש דוגמאות ויש תרגילים פתוחים.

ברגע שאני מוסיף פיתרון לתרגיל הפכתי אותו מתרגיל לדוגמא - ואז רק פגעתי בתמהיל.

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

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

שלום,

ראשית, השיעורים לבינתיים מאוד מאוד מהנים!
אני רוצה להשתמש עם ספריית Lodash מ-npm לתרגיל של מיון מספרים רנדומליים,
גם התקנתי את החבילה הזו ואני משתמשת איתה בצורה זו const lodash = require(‘lodash’); (כמו בדוגמא שהשתמשת עם express
משום מה נופל לי בCMD על הפונקציהsort מתוך הספרייה הנ"ל

מה יכוה ליהות הבעיה?

לייק 1

קשה לדעת בלי לראות את הקוד - אבל על פניו אם היתה בעיה בטעינת הספריה היינו רואים נפילה בשלב ה require. נפילה בשורה של sort רומזת שמשהו לא בסדר ספציפית בשורה זו.

רוצה לנסות להדביק כאן את הקוד?

תודה!

const lodash = require('lodash');

function random() {
    let list = [];
    let r;
    r = Math.floor(Math.random() * 100)
    list.push(r)
    for (let i = 0; i < 4; i++) {
        do {
            r = Math.floor(Math.random() * 100)
        }
        while (list.find(e => e == r))
        list.push(r)
    }
    lodash.sort(list)
    for (let i = 0; i < list.length; i++) {
        console.log(list[i])
    }
}
random();

נפל בשורה זו :
lodash.sort(list)

בסוף השתמשתי עם פונקציות של
JS רגילות לsort ו-find

לגבי תרגיל ההרחבה שנתת’ עדכנו את השרת שכתבתם ב-6 כך שהמספרים יוגרלו רק בפניה הראשונה אבל בכל בקשה נוספת יודפסו אותם המספרים בדיוק.’ ניסתי לנחש ועשיתי כך , לא עובד

const express = require('express');

const app = express();

// app.get('/', function(req, res) {

//     res.send('fgfgfgfgfg')

// })

// app.get('/primes', function(req, res) {

//     res.send('adaddadadad')

// })

app.get('/lotto', function(req, res) {

    req.once(function(e) {

        let r, list = [];

        for (let i = 0; i < 5; i++) {

            r = Math.floor(Math.random() * 100)

            list.push(r);

        }

    })

    res.send(list)

})

app.listen(3000)

תוכל לתת בבקשה רמז ??

הי אז בדרך כלל אנחנו קוראים לספריה lodash בשם המופלא _ (זאת גם הסיבה בגללה הספריה נקראת lodash), כלומר נעדיף לכתוב:

const _ = require('lodash');

דבר שני אין בספריה lodash פונקציה בשם sort אלא פונקציית המיון נקראת sortBy

שלום,

לגבי השאלה השניה שהצגתי תוכל לתת לי רמז?

הי,
אני לא זוכר שלימדתי את req.once - יכולה להסביר מה הוא עושה? ולמה חשבת להשתמש בו?

בתוכנית node.js כמו שכתבת - איזה משתנים שומרים על ערכם בין בקשות שונות לשרת? ואיזה משתנים מתאפסים בכל בקשה מחדש?

היי ינון,
מצרפת את הפתרון שלי לתרגיל 1 סעיף 2:

הי,
כמה דברים מבחינת קריאות של הקוד:

  1. כדאי להשתמש באינדנטציה בתוך הפונקציה fac - מה שבתוך בלוק צריך להיות מיושר יותר ימינה כדי שנוכל להבין מה קשור למה

  2. שמות משתנים אצלך לא אומרים הרבה - כדאי לבחור שמות משמעותיים

  3. כדאי להוסיף מעל הקריאה ל app.get הסבר מה הנתיב הזה עושה ומחזיר (במקרה שלנו “נתיב זה יגריל 5 מספרים באופן אקראי ויחזיר אותם לדפדפן”)

  4. אני רואה שאת מנסה להגריל מספרים ייחודיים ובשביל זה שומרת את כל המספרים שהגרלת בתוך מערך. מבנה הנתונים Set של JavaScript יותר מתאים לזה. בסוף הפונקציה אפשר להעביר את הנתונים מ Set למערך, לסדר ולהחזיר. אפשר ללמוד עליו בשיעור כאן:
    https://www.tocode.co.il/bundles/es6/lessons/maps-and-sets
    (ובאופן כללי אני ממליץ לבצע את קורס ES6 לפני שממשיכים ל Node או לפחות לראות שאת מכירה את כל הנושאים שם).

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

אני הייתי כותב את הפונקציה כך:

// Creates and returns an array of size 5
// with random numbers
function createNRandomNumbers(n) {
  let numbersFound = new Set();

  while (numbersFound.size < n) {
    numbersFound.add(Math.floor(Math.random() * 50));
  }

  return [...numbersFound].sort((a, b) => a - b);
}

היי ינון באופן כללי רציתי לומר תודה על האתר הוא ממש מצויין
ואני מרגישה שהוא מאד עוזר לי!

לייק 1

Hi @ynonp!
Regarding Luke Skywalker films http exercise,
I am stuck while trying to do it without external libraries(axios) and without Promises,
only by class material using https and http module.
There is an inner loop of http calls for each film of films array of the Luke Skywalker with callbacks - pretty unpleasant stuff to deal with.
Was it your intention to complete the exercise by using https and http modules only?

Hi @avrahamm

I showed here how to use http library to make a web request:
https://www.tocode.co.il/bundles/nodejs/lessons/03-hello-nodejs-world?tab=article

It might not be as comfortable as axios but it work. If you’re stuck you can publish the code you wrote and I’ll be happy to suggest some ideas to go forward

However in general in the exercises you don’t need to limit yourself just to the things I demonstrated in the videos. The purpose of the exercises is to provide an “open” training ground and you can use any trick you’re familiar with to move forward

Thank you for trying to help,
yet if this is just a weird unacceptable idea to work this way instead using axios and promises,
I do not want you to waste your time…

Time spent on learning is never time wasted
And if you do want to get this to work with callbacks it’s very possible and I’d be happy to help

However like you said promises and/or axios both yield a better solution so feel free to use them

Thank you, I solved with axios and promises…


const lukeUrl = 'https://swapi.dev/api/people/1/';
app.get('/', async (req, res) => {
        const lukeData = await axios.get(lukeUrl);
        const filmUrls = lukeData.data.films;
        const filmPromises = filmUrls.map(async filmUrl => await axios.get(filmUrl) );
        const filmsData = await Promise.all(filmPromises);
        const titles = filmsData.map( film => film.data.title);
        res.send(titles.join("<br/>"));
})
לייק 1

נראה מעולה.
השימוש ב Promise.all ממש במקום כי הוא גרם לכל בקשות הרשת להתבצע במקביל

שלום,
בקשר לתרגיל 1 סעיף 1 זה מה שכתבתי, זה עובד אבל אולי יש דרך יותר יעילה?

function primeNumbers(){

    let counter = 0;

    for(let i = 1; i<=1000; i++){

        for(let j=1; j<=i; j++){

            if(i % j == 0 && j!== i && j!== 1){

                break;

            }

            if(j == i ) counter++;

        }

    }

    return counter;

}

console.log(primeNumbers());

וזה הסעיף השני

function randomNumbers(){

    let ranNumbers = [];

    for(let i = 1; i<= 5; i++){

        ranNumbers.push(Math.floor(Math.random()*100));

    }

    return ranNumbers.sort();

}

console.log(randomNumbers());