Интерпретация модуля Node.js util

Node.js внешний интерфейс Debug Promise

Интерпретация Node-модуля четвертого util-модуля, который был представлен ранее.вм-модуль,Буферный модуль,.

  • передача стиля
  • вывод отладки
  • Устаревший API

передача стиля

обратный вызов преобразует обещание

Для функций, которые передают обратный вызов error-first в качестве последнего параметра функции (например, fs.readFile('./filename', (err, data) => {})), util предоставляет метод promisify(original) to convert Функция этого типа преобразуется в форму, возвращающую обещание.

Возьмите fs.readFile в качестве примера.

const fs = require('fs');

fs.readFile('./h.js', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data.toString());
})

// 使用util.promisify转换后
const fs = require('fs');
const util = require('util');
const readFilePromise = util.promisify(fs.readFile);
readFilePromise('./h.js')
  .then((data) => {
    console.log(data.toString());
  }, (err) => {
    console.error(err);
  });
Реализация

После выполнения обещания возвращается новая функция.Результатом выполнения новой функции является обещание.Новая функция вызовет исходный метод и автоматически добавит обратный вызов типа error-first.Согласно результату выполнения исходного , считается, что разрешить или отклонить, простая версия кода выглядит следующим образом:

function promisify(original) {
  function fn(...args) {
    const promise = createPromise();
    try {
      original.call(this, ...args, (err, ...values) => {
        if (err) {
          promiseReject(promise, err);
        } else {
          promiseResolve(promise, values[0]);
        }
      });
    } catch (err) {
      promiseReject(promise, err);
    }
    return promise;
  }
  return fn
}

Модуль UTIL также предоставляет собой пользовательский режим преобразования Щел для вырыва (util.promisify.custom атрибут по происхождению », например, для чтения файла отключенного файла, util.promisify.custom должен быть определен до Util.promisify

const fs = require('fs');
const util = require('util');
fs.readFile[util.promisify.custom] = (fileName) => {
  return Promise.reject('not allowed');
}
const readFilePromise = util.promisify(fs.readFile);
readFilePromise('./h.js')
  .then((data) => {
    console.log(data.toString());
  }, (err) => {
    console.error(err);    // not allowed
  });

Обещай обратный вызов

Метод callbackify в util является полной противоположностью promisify.Callbackify используется для преобразования асинхронных (или возвращающих промисов) функций в типы, соответствующие стилю обратного вызова с первой ошибкой.

const util = require('util');
const fn = () => {
  return 'fn executed'
};
function delay(second, fn) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(fn());
    }, second);
  });
}
delay(1000, fn)
.then((data) => {
  console.log(data); // fn executed
});

// 使用util.callbackify转换后

const delayFn = util.callbackify(delay);
delayFn(1000, fn, (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);  // fn executed
});

Есть одна ситуация, требующая внимания: если промис отклонен(null || 0 || false), то ошибка обратного вызова оценивается как отрицательная, и программа продолжает выполнять console.log(data), который на самом деле неверно. Таким образом, callbackify выполняет специальную обработку для этой ситуации (создает ошибку, помещает исходную информацию в свойство причины ошибки и передает ошибку в окончательную функцию обратного вызова).

function callbackifyOnRejected(reason, cb) {
  if (!reason) {
    const newReason = new ERR_FALSY_VALUE_REJECTION();
    newReason.reason = reason;
    reason = newReason;
    Error.captureStackTrace(reason, callbackifyOnRejected);
  }
  return cb(reason);
}
Реализация

Реализованная логика состоит в том, чтобы вызвать исходную функцию original, чтобы затем вызвать метод обратного вызова.

function callbackify(original) {
  function callbackified(...args) {
    const maybeCb = args.pop();
    const cb = (...args) => { Reflect.apply(maybeCb, this, args); };
    Reflect.apply(original, this, args)
      .then((ret) => process.nextTick(cb, null, ret),
            (rej) => process.nextTick(callbackifyOnRejected, rej, cb));
  }
  return callbackified;
}

вывод отладки

util.debuglog(section)

Метод отладки используется для выборочного вывода отладочной информации в соответствии с переменной среды NODE_DEBUG, например, в следующем примере.

//index.js 
const util = require('util');
const debuglog = util.debuglog('foo-bar');

debuglog('hello from foo [%d]', 123);

// 执行index文件
node index.js // 没有输出
NODE_DEBUG=foo-bar node index.js //FOO-BAR 18470: hi there, it's foo-bar [2333]

NODE_DEBUG можно разделить запятыми, если вы хотите вывести несколько разделов, а NODE_DEBUG также поддерживает форму подстановочных знаков (для версии узла требуется 10)

NODE_DEBUG=fs,net,tls // 多个section
NODE_DEBUG=foo*  // 通配符

Приведенная выше функция журнала отладки поддерживает заполнители при выполнении.На самом деле нижний уровень использует метод util.format.

util.format

util.format используется для замены заполнителей, а разные типы данных представлены разными заполнителями.

%s нить
%d Целое число или число с плавающей запятой
%i целое число
%f Плавать
%j JSON
%o
%O Объект (за исключением неперечислимых свойств)
%% выход %

Метод UTIL.inspect фактически используется при форматировании выходной строки для объекта. Разница между% o и% o заключается в том, что элементы конфигурации различны при вызове метода проверки.

%o 传入util.inspect的配置项是 { showHidden: true, showProxy: true }

util.inspect

Строка формата util.inspect для объекта, чтобы выполнить операцию и предоставить персонализированный CI

const util = require('util');
var child = {
  "name": "child",
  "age": 18,
  "friends": [
    {
      "name": "randal",
      "age" : 19,
      "friends": [
        {
          "name": "Kate",
          "age": 18
        }
      ]
    }
  ],
  "motto": "Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning."
}
console.log(util.inspect(child, { compact: false, depth: null, breakLength: 80}));

compact используется для отображения каждого атрибута в отдельной строке

глубина используется для управления уровнем отображения, по умолчанию 2

breakLength используется для максимального количества текста в строке за пределами разрыва строки.

Более подробные параметры и интерпретацияapi

Устаревший API

Используйте метод util.deprecate для вывода информации об отброшенных запросах на терминал для отброшенных API.

const util = require('util');
const oldFn = () => {
  console.log('old fn');
};
class oldClass {
  constructor() {
    console.log('old class');
  }
}
const fn1 = util.deprecate(oldFn, 'deprecated fn');
const fn2 = util.deprecate(oldClass, 'deprecated class');
fn1();
new fn2();

// 输出
old fn
old class
(node:18001) DeprecationWarning: deprecated fn
(node:18001) DeprecationWarning: deprecated class
Реализация
function deprecate(fn, msg, code) {
  let warned = false;
  function deprecated(...args) {
    if (!warned) {
      warned = true;
      if (code !== undefined) {
        if (!codesWarned[code]) {
          process.emitWarning(msg, 'DeprecationWarning', code, deprecated); // emit警告信息
          codesWarned[code] = true; // 避免同一errorCode重复提示
        }
      } else {
        process.emitWarning(msg, 'DeprecationWarning', deprecated);
      }
    }
    if (new.target) { // class类型
      return Reflect.construct(fn, args, new.target);
    }
    return fn.apply(this, args); // 函数类型
  }
  return deprecated;
}
Элементы конфигурации командной строки, относящиеся к этому
параметры командной строки
--no-deprecation
--no-warnings
noDeprecation
--trace-deprecation
--trace-warnings
traceDeprecation
Выдает исключение ошибки --throw-deperecation throwDeprecation

разное

В дополнение к трем инструментам, упомянутым выше, util.types также предоставляет очень богатый метод идентификации типов (isGeneratorFunction, isWeakSet, isPromise, isArrayBuffer) и т. д. В будущем, когда вам понадобится оценка типа, вы можете рассмотреть возможность использования шаблона util. эти методы.

использованная литература

узел будет .org/day3/latest…