English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS دروس الأساس

NodeJS Express.js

NodeJS 缓冲&URL;

NodeJS MySql

NodeJS MongoDB

NodeJS ملف (FS)

NodeJS أخرى

أدوات Node.js الشائعة

util هو مكتبة رئيسية في Node.js تقدم مجموعة من الوظائف المفيدة، تستخدم لتعويض نقص الوظائف في JavaScript الأساسي.

طريقة الاستخدام كالتالي:

const util = require('util');

util.callbackify

util.callbackify(original) ُتحوّل الدالة المرتجعة المُتسلسلة (أو الدالة التي تعود قيمة هي Promise) إلى دالة تتبع الأخطاء أولاً، مثل (err, value) => ... كآخر معامل. في الدالة المرتجعة، يكون الأولى هي سبب الرفض (إذا تم حل Promise، يكون `null`)، والثانية هي القيمة المُحلّة.

مثال على الخط

const util = require('util');
async function fn() {
  return 'hello world';
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
  if (err) throw err;
  console.log(ret);
});

نتيجة إخراج الكود أعلاه هي:

hello world

تُنفذ الدالة المرتجعة بشكل متسلسل، وتكون لديها تعقب أخطاء في سلسلة الاستثناءات. إذا أطلقت الدالة المرتجعة استثناءً ما، فإن العملية ستنشئ استثناءً 'uncaughtException'، وإن لم يتم التقاطعه، فإن العملية ستتوقف.

لدي `null` في الدالة المرتجعة معنى خاص، إذا كانت الدالة المرتجعة الأولى هي سبب رفض Promise وكانت تحتوي على قيمة يمكن تحويلها إلى قيمة بولية `false`، فإن هذه القيمة ستتكون في كائن Error، ويمكن الحصول عليها عبر الخاصية reason.

function fn() {
  return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
  // عندما يتم رفض Promise باستخدام `null`، يتم تعبئته بـ Error وتبقى القيمة الأصلية في `reason`.
  err && err.hasOwnProperty('reason') && err.reason === null; // true
});

original یک تابع غیرمستقیم (async) است. این تابع یک تابع بازگشتی سنتی را برمی‌گرداند.

util.inherits

util.inherits(constructor, superConstructor) یک تابع برای انجام ارث نمونه‌ها است.

ویژگی‌های اطلاعاتی شیء در JavaScript بر اساس نمونه است، که با روش‌های معمول بر اساس کلاس متفاوت است. JavaScript ویژگی‌های ارث‌برندی در سطح زبان ارائه نمی‌دهد، بلکه با استفاده از کپی نمونه‌ها به دست می‌آید.

در اینجا فقط از استفاده از util.inherits توضیح داده می‌شود، مثال زیر است:

var util = require('util'); 
function Base() { 
    this.name = 'base'; 
    this.base = 1991; 
    this.sayHello = function() { 
    console.log('Hello ' + this.name); 
    }; 
} 
Base.prototype.showName = function() { 
    console.log(this.name);
}; 
function Sub() { 
    this.name = 'sub'; 
} 
util.inherits(Sub, Base); 
var objBase = new Base(); 
objBase.showName(); 
objBase.sayHello(); 
console.log(objBase); 
var objSub = new Sub(); 
objSub.showName(); 
//objSub.sayHello(); 
console.log(objSub);

ما یک شیء پایه Base و یک شیء Sub که از Base ارث برده است، تعریف کرده‌ایم، Base دارای سه ویژگی تعریف شده در داخل فراخوانی‌کننده و یک تابع تعریف شده در نمونه است و با استفاده از util.inherits ارث برده می‌شود. نتیجه اجرا به شرح زیر است:

base 
Hello base 
{ name: 'base', base: 1991, sayHello: [Function] } 
sub 
{ name: 'sub' }

توجه:Sub فقط وراثت فنی‌هاي تعریف شده در نمونه Base را به ارث برده است، و ویژگی‌های base و تابع sayHello که در داخل فراخوانی‌کننده ایجاد شده‌اند، وراثت نیافته‌اند.

بالإضافة إلى ذلك، لا يتم إخراج الخصائص المحددة في النموذج كخصائص الأشياء بواسطة console.log. إذا كنا نزيل التعليق من سطر objSub.sayHello();، سنرى: }}

node.js:201 
throw e; // خطأ process.nextTick أو 'error' الحدث في أول تشغيل 
^ 
خطأ TypeError: لا يوجد لـ Object #<Sub> طريقة 'sayHello'. 
في Object.<anonymous> (/home/byvoid/utilinherits.js:29:8) 
في Module._compile (module.js:441:26) 
في Object..js (module.js:459:10) 
في Module.load (module.js:348:31) 
في Function._load (module.js:308:12) 
في Array.0 (module.js:479:10) 
في EventEmitter._tickCallback (node.js:192:40)

util.inspect

util.inspect(object,[showHidden],[depth],[colors]) هي طريقة تحويل أي شيء إلى نص، وتُستخدم عادةً في التتبع وإخراج الأخطاء. إنها تأخذ على الأقل متغيرًا واحدًا object، وهو الأشياء الذي سيتم تحويله.

showHidden هو متغير اختياري، إذا كانت القيمة صحيحة، سيتم إخراج المعلومات المخفية.

يُمثل depth عدد الأعمار المسموح به للمسار، إذا كانت الأشياء معقدة، يمكنك تحديد الأعمار للتحكم في كمية المعلومات التي يتم إخراجها. إذا لم يتم تحديد depth، فإن القيمة الافتراضية ستكون 2 عمود، وإذا تم تحديدها على أن تكون null، فإنها ستكون غير محدودة في الأعمار لتغطية الأشياء بالكامل.

ما يجب ملاحظته بشكل خاص هو أن util.inspect لن يتحويل ببساطة وتقدير الأشياء إلى نص، حتى لو كان الأشياء معرفًا بـ toString لن يتم استدعاؤه.

var util = require('util'); 
function Person() { 
    this.name = 'byvoid'; 
    this.toString = function() { 
    return this.name; 
    }; 
} 
var obj = new Person(); 
console.log(util.inspect(obj)); 
console.log(util.inspect(obj, true));

نتيجة التنفيذ هي:

Person { name: 'byvoid', toString: [Function] }
Person {
  name: 'byvoid',
  toString: 
   { [Function]
     [length]: 0,
     [name]: '',
     [arguments]: null,
     [caller]: null,
     [prototype]: { [constructor]: [Circular] } }

util.isArray(object)

إذا كان المعامل المقدم "object" هو مصفوفة، فإنه يعود بالقيمة true، وإلا يعود بالقيمة false.

var util = require('util');
util.isArray([])
  // true
util.isArray(new Array)
  // true
util.isArray({})
  // false

util.isRegExp(object)

إذا كان المعامل المقدم "object" هو تعبير عشوائي، فإنه يعود بالقيمة true، وإلا يعود بالقيمة false.

var util = require('util');
util.isRegExp(/some regexp/)
  // true
util.isRegExp(new RegExp('another regexp'))
  // true
util.isRegExp({})
  // false

util.isDate(object)

إذا كان المعامل المقدم "object" هو تاريخ، فإنه يعود بالقيمة true، وإلا يعود بالقيمة false.

var util = require('util');
util.isDate(new Date())
  // true
util.isDate(Date())
  // false (without 'new' returns a String)
util.isDate({})
  // false

للإطلاع على المزيد من التفاصيل يمكن زيارة http://nodejs.org/api/util.html للإطلاع على المعلومات التفصيلية.