מדריך Node.js: שימוש ב-Utilities

במאמר הזה אנו מדברים על פונקציות שימושיות ב-Node.js utils ובמיוחד על מתודה שמאפשרת לנו לעשות ירושה בקלות.
Node.js Logo

במאמר הקודם הסברתי על אירועים ב-Node.js ואז אמרתי שאפשר לבצע ירושה באופן פשוט וקל עם utlities. זה גם מה שנלמד היום – איך משתמשים ב-utilities שזה עוד מודול ליבה של Node.js. רשימת כל מודולי הליבה, אגב, נמצאת באתר של Node.js.

באופן עקרוני, מודול Utilities הוא לא מודול "אמיתי" אלא אוסף של כלים שימושיים במיוחד. חלק מהכלים מסייעים לנו להפוך את הקוד ליותר נקי, חלק מהכלים עושים פעולות משמעותיות במיוחד. כל המתודות נמצאות בדוקומנטציה של Node.js Utilities ומומלץ להסתכל עליה.

המתודה הראשונה שאנו רואים היא מתודה שמאוד דומה ל-sprintf, אם אתם מכירים – שזו דרך מאוד שימושית ליצור מחרוזת טקסט עם משתנים. הנה דוגמה:


util = require("util"); //The require

someVar = 'This is my var!'

var result = util.format('This is some test string with variable example: %s', someVar);

console.log(result);
//prints: This is some test string with variable example: This is my var!

אם נמשיך ונסתכל במתודות שיש בדוקומנטציה, אנו נראה שיש שם כמה מתודות שפשוט מדפיסות לקונסולה, למשל:


require('util').debug('message on stderr');

או אפילו עם time stamp!


require('util').log('Timestamped message.');

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


var util = require('util');
var http = require('http');

console.log(util.inspect(http, { showHidden: false, depth: null, colors: true }));

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

ב-JavaScript, כל דבר, למעט מערך, נחשב כאובייקט. בין אם מדובר בפונקציה, מחרוזת טקסט או מספר. כל דבר הוא אובייקט. למרות זאת, אין דרך נורמלית לבצע ירושה. למה אנחנו צריכים לבצע ירושה? קחו למשל את מודול events שעליו דיברנו במאמר הקודם – על מנת שהמודול שאני כותב יוכל לירות אירועים, יהיה לי הרבה יותר קל לרשת ממודול אירועים מאשר להתחיל לעשות require ל-events, להחזיר את זה לאובייקט וממנו לקרוא ל-emit. הרבה יותר קל לעשות משהו כזה:


myModule.prototype.saveTheObject = function (obj) {
    //doing something that related to saving
    this.emit("saved-myModule", obj);
};

כלומר שמתודת ה-emit, או מתודת ה-on שמאזינה לאירועים (אם המודול שלי קשור למודולים אחרים שמשחררים אירועים) תהיה חלק מה-class שלי. איך אני בעצם גורם ל-myModule class לרשת מ-event? כאן נכנסת לפעולה מתודת inherits שמקבלת שני ארגומנטים – את האובייקט שיורש ואת האובייקט שיורשים ממנו. ככה זה נראה בעולם האמיתי:


var util = require("util");
var events = require("events");

function myModule() { //first we create the module object

}

util.inherits(myModule, events.EventEmitter); //The inheritance

myModule.prototype.saveTheObject = function (obj) { //some method that emitting event
    //doing something that related to saving
    this.emit("saved-myModule", obj);
};


/** module ends here **/


var myModule = new myModule(); //creating the instance

myModule.on("saved-myModule", function(data) {
    console.log('Received data: "' + data + '"');
})

myModule.saveTheObject("It works!"); // Received data: "It works!"

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

חשוב לציין שיש לא מעטים שחושבים שירושה ב-JavaScript היא לא נכונה ויעדיפו לעשות instance לאובייקטים ולהשתמש במתודות שלהם באופן ישיר. אבל טוב לדעת שזה אפשרי.

במאמר הבא אנו נדבר על streams ב-Node.js

⚠️ תזכורת – המדריכים האלו הם רק טעימה, בספר שלי "ללמוד Node.js בעברית" יש הסברים מלאים ומקיפים על השפה המיועדים ללימוד עצמי. עם תרגילים והסברים. הספר יצא לאור בשיתוף הקריה האקדמית אונו ובתמיכת החברות אלמנטור, ו-Iron source ונערך טכנית על ידי בנג'י גרינבאום (מפתח ליבה של Node.js), גיל פינק ומתכנתים מעולים נוספים. 

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

נגישות טכנית – פודקאסט ומבוא

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

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

מיקרו בקרים

חיבור מצלמה למיקרובקר

חיבור מצלמה למיקרו בקר ויצירה של מצלמת אבטחה מרחוק בעלות של 20 שקל.

בינה מלאכותית

Safeguards על מודל שפה גדול (LLM)

פוסט בשילוב עם פודקאסט וסרטון על ההגנות שאפשר להציב על LLM בסביבת פרודקשן

גלילה לראש העמוד