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

במאמר הקודם הסברתי על אירועים ב-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
למאמר הבא בסדרת המדריכים על Node.js

אהבתם? לא אהבתם? דרגו!

לא אהבתי בכלללא אהבתיבסדראהבתיאהבתי מאוד (3 הצבעות, ממוצע: 5.00 מתוך 5)

תגיות: פורסם בקטגוריה: Node.js

אל תשארו מאחור! יש עוד מה ללמוד!

One comment on “מדריך Node.js: שימוש ב-Utilities
  1. Yaniv הגיב:

    (node) util.debug is deprecated. Use console.error instead.