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) => ... callback в качестве последнего параметра. В回调-функции первый параметр - причина отказа (если 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 - это асинхронная функция. Эта функция возвращает традиционную функцию回调.

util.inherits

util.inherits(constructor, superConstructor) - это функция, реализующая прототипное наследование объектов.

Объектно-ориентированные свойства 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 есть три свойства, определенные в конструкторе, и функция, определенная в прототипе, inheritance реализуется через util.inherits. Результат выполнения таков:

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

Внимание:Sub наследует только функции, определенные в прототипе Base, а свойства base и функция sayHello, созданные внутри конструктора Sub, не наследуются.

Кроме того, свойства, определенные в прототипе, не выводятся как свойства объекта console.log. Если мы удалим комментарий из строки objSub.sayHello();, мы увидим: }}

node.js:201 
throw e; // process.nextTick error, или 'error' событие на первом тике 
^ 
TypeError: Объект #<Sub> не имеет метода 'sayHello' 
at Object.<anonymous> (/home/byvoid/utilinherits.js:29:8) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40)

util.inspect

util.inspect(object,[showHidden],[depth],[colors]) - это метод, который преобразует любой объект в строку, обычно используется для отладки и вывода ошибок. Он принимает по крайней мере один параметр object, который представляет собой объект, подлежащий преобразованию.

showHidden является опциональным параметром, если значение true, будет выводиться больше скрытой информации.

depth представляет собой максимальное количество уровней рекурсии, если объект очень сложный, вы можете определить уровень для управления количеством выводимой информации. Если значение colors равно true, формат вывода будет кодироваться ANSI-цветами, что обычно используется для отображения более красивых эффектов в терминале.

Особенно стоит отметить, что 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 (без 'new' возвратит String)
util.isDate({})
  // false

更多详情可以访问 http://nodejs.org/api/util.html 了解详细信息。