node.js チュートリアルの Util モジュールの例の詳細な説明

node.js チュートリアルの Util モジュールの例の詳細な説明

タイプ判定から始める

JavaScript では変数の型チェックが非常に面倒です。単純にtypeofさまざまな問題が発生します。

以下に簡単な例をいくつか挙げます。

console.log(typeof null) // 'オブジェクト'
console.log(typeof new Array) // 'オブジェクト'
console.log(typeof new String) // 'オブジェクト'

その後、 Object.prototype.toString()メソッドを使用して変数の型を判別できることが誰もが発見しました。

const getTypeString = obj => Object.prototype.toString.call(obj)
 
getTypeString(null) // '[オブジェクト Null]'
getTypeString('string') //'[オブジェクト文字列]'
getTypeString(新しい文字列) //'[オブジェクト文字列]'

toString()メソッドをプロキシすることで、文字列型を取得し、この文字列を使用して何かを行うことができます。

定数 getTypeString = obj => {
  Object.prototype.toString.call(obj) を返します。
}
定数isType = 型 => {
  戻り値:
    getTypeString(obj) === `[オブジェクト ${type}]` を返します
  }
} 
const isArray = isType('Array') // このメソッドは通常 Array.isArray に置き換えられます const isNull = isType('Null')
定数isObject = isType('オブジェクト')
定数isRegExp = isType('RegExp')
const isFunction = isType('関数')
const isAsyncFunction = isType('AsyncFunction')
isNull(null) // 真
isObject({}) // 真
isRegExp(/\w/) // 真
isFunction(() => {}) // 真
isAsyncFunction(async () => {}) // 真

しかし、Node.js には、変数の型を決定するための API セットが実際に存在します。そして、非常に豊富な機能を持っています。基本的な型の判定に加え、Promiseオブジェクト、Dateオブジェクト、各種ArrayBuffersの判定もサポートしています。

const 型 = require('util/types')
types.isDate(新しい日付) // true
types.isPromise(新しいPromise(() => {})) // true
types.isArrayBuffer(新しいArrayBuffer(16)) // 真

厳格な平等

JavaScript では、オブジェクト、配列、その他の変数の等価性を判断するときに===を使用すると、通常は 2 つの変数が同じメモリ アドレスを指しているかどうかのみが判断されます。オブジェクトのキーに対応するすべての値が等しいかどうかを判断したい場合は、2 つのオブジェクトを走査する必要があります。 utilには、2つのオブジェクトが厳密に等しいかどうかを判定するために使用できるメソッドもあります: util.isDeepStrictEqual(val1, val2)

const util = require('util')
const val1 = { 名前: 'shenfq' }
const val2 = { 名前: 'shenfq' } 
console.log('val1 === val2', val1 === val2) // false
console.log('isDeepStrictEqual', util.isDeepStrictEqual(val1, val2)) // true

このメソッドは、配列が厳密に等しいかどうかを判断するためにも使用できます。

const util = require('util')
定数arr1 = [1, 3, 5]
定数arr2 = [1, 3, 5]
console.log('arr1 === arr2', arr1 === arr2) // false
console.log('isDeepStrictEqual', util.isDeepStrictEqual(arr1, arr2)) // 真

エラーファーストと約束

初期の Node API はすべてError Firstスタイルでした。つまり、すべての非同期関数はコールバック関数を受け入れ、その 1 つのパラメータはエラー オブジェクトでした。エラー オブジェクトが正常に返された場合はnullになり、後続のパラメータは成功した応答の結果になります。

// 以下はファイルの読み取り例です。const fs = require('fs')
fs.readFile('nginx.log', (エラー、データ) => {
  if (エラー) {
    // ファイルの読み取りに失敗しました console.error(error)
    戻る
  }
  // ファイルを正常に読み取り、結果を出力します console.log(data)
})

Node 8 がリリースされると、 Error Firstスタイルの API を Promise API に変換するための新しいpromisifyインターフェースが追加されました。

定数 fs = require('fs')
const util = require('util') 
const readFile = util.promisify(fs.readFile)
ファイルの読み取り('./2021-11-11.log'、{エンコーディング: 'utf-8' })
  .then(テキスト => console.log(テキスト)) 
    .catch(エラー => console.error(エラー))

しかし、その後、多くの人が、これらのネイティブ API が Promise をサポートする方法は面倒すぎると感じ、各 API を個別のpromisifyメソッドでラップする必要があると感じました。 Node 10 がリリースされると、ネイティブ モジュールに.promisesプロパティが追加され、このプロパティの下にあるすべての API は Promise スタイルになります。

const fs = require('fs').promises
fs.readFile('./2021-11-11.log', { エンコーディング: 'utf-8' })
  .then(テキスト => console.log(テキスト)) 
    .catch(エラー => console.error(エラー))

注: Node 14 以降では、パッケージ名を変更してインポートするという、 promises API をインポートする新しい方法が追加されました。

const fs = require('fs/promises')
fs.readFile('./2021-11-11.log', { エンコーディング: 'utf-8' })
  .then(テキスト => console.log(テキスト)) 
    .catch(エラー => console.error(エラー))

Error Firstスタイルの API を Promise API に変換するだけでなく、 utilasync関数をError Firstスタイルの関数に変換するためのcallbackifyメソッドも提供します。

次に、 callbackify使用して、promise 化されたfs Error Firstスタイルの関数に復元します。

const fs = require('fs/promises')
const util = require('util')
const readFile = util.callbackify(fs.readFile)
readFile('./2021-11-12.log', { エンコーディング: 'utf-8' }, (エラー、テキスト) => {
  if (エラー) {
    コンソール.エラー(エラー)
    戻る
  }
  console.log(テキスト)
})

デバッグと出力

Node サービスを開発している場合は、コンソールでより明確なデバッグ情報を確認できるdebugモジュールを使用する必要があります。

const デバッグ = require('デバッグ')
定数ログ = デバッグ('app')
const ユーザー = { 名前: 'shenfq' } 
log('現在のユーザー: %o', ユーザー)

実際、 util.debugを通じて同様の効果を実現できます。

const デバッグ = require('デバッグ')
定数ログ = デバッグ('app')
const ユーザー = { 名前: 'shenfq' } 
log('現在のユーザー: %o', ユーザー)

起動時にDEBUG環境変数をNODE_DEBUGに置き換えるだけです。

上記のコードをよく見ると、 log('當前用戶: %o', user)メソッドの前の文字列に%oプレースホルダーがあり、この場所にオブジェクトが入力されることがわかります。これは C や Python のprintfに似ています。同様に、 utilモジュールでは、フォーマット方法が直接提供されます: util.format

const { format } = require('util')
コンソール.log(
  format('現在のユーザー: %o', {
    名前: 'shenfq'、年齢: 25
  })
)

%oプレースホルダーに加えて、異なるデータ タイプには異なるプレースホルダーを使用する必要があります。

プレースホルダータイプ
%s
%d数値(整数と浮動小数点数の両方)
%私整数
%f浮動小数点数
%j翻訳
%o物体

JavaScript のオブジェクトは非常に複雑です。 util.format %oプレースホルダーとともに直接使用してオブジェクトをフォーマットするだけでなく、 utilは、オブジェクトをフォーマットするためのinspectというメソッドも用意されています。

const { 検査 } = require('util')
定数ユーザー = {
  年齢: 25歳
  名前: 'shenfq',
  仕事:
    名前: 'コーディング',
    勤続年数: 5
  }
} 
console.log(検査(ユーザー))

どうやら、 inspect何も行わないようですが、 inspectメソッドには、フォーマット中にカスタマイズされた構成を行うための 2 番目のパラメーターがあります。

depth: number : 表示レベルを制御します。

sorted: boolean|Function : キーのエンコードされた値でソートするかどうか。

compact: boolean : 1 行で表示するかどうか。

もちろん、上記は設定の一部にすぎません。より詳細な設定については、ノードのドキュメントを参照してください。以下にいくつか例を挙げてみましょう。

すべてのプロパティは改行内に表示されます。

検査(ユーザー、{
    コンパクト: false
})

オブジェクトの最初のレベルの値のみをフォーマットします。

検査(ユーザー、{
  深さ: 0,
    コンパクト: false
})

キー値のエンコードに従って逆順に出力します。

検査(ユーザー、{
    コンパクト: false、
  ソート済み: (a, b) => a < b ? 1 : -1
})

上記は、node.js の Util モジュールのチュートリアル例の詳細内容です。node.js の Util モジュールの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • NodeJSのモジュール性に関する詳細な説明
  • Node.js組み込みモジュールの詳細な説明
  • Node.js API ユーティリティモジュールの使用例の分析の詳細な説明
  • Node.js に基づく一般的なツール モジュール util の使用状況の分析
  • Node.js 共通ツール ユーティリティ モジュール

<<:  MySQL でのサブクエリの基本的な使用法

>>:  ページを更新せずにフォームを送信するには iframe を使用します

推薦する

vsftpd ユーザーが ssh 経由でログインすることを禁止する方法

序文vsftp は使いやすく安全な FTP サーバー ソフトウェアです。システムユーザーまたは仮想ユ...

JS ES 新機能テンプレート文字列

目次1. テンプレート文字列とは何ですか? 2. 複数行のテンプレート文字列2.1 式付きテンプレー...

JavaScript でプロトタイプ パターンを実装する方法

概要プロトタイプ パターンは、プロトタイプ インスタンスによって作成されるオブジェクトの型を指し、こ...

Nest.js のハッシュと暗号化の例の詳細な説明

0x0 はじめにまず、ハッシュアルゴリズムとは何でしょうか?メッセージやセッション項目など、一部のデ...

Docker で MySQL データベースを使用して LAN アクセスを実現する

1. MySQLイメージを取得する docker pull mysql:5.6注: mysql5.7...

Ubuntuのソースリスト(ソースリスト)を変更する方法詳細説明

導入Ubuntu のデフォルトのソースは国内サーバーではないため、更新されたソフトウェアのダウンロー...

Centos7 システムでの python2 と python3 の共存

最初のステップは、Python のバージョン番号とインストール パスを確認することです。 上記のビュ...

CSS BEM 記述標準の詳細な説明

BEM は、Web 開発に対するコンポーネントベースのアプローチです。ユーザー インターフェイスを独...

MySQL DATE_FORMAT関数の使用

タオバオが、ダブル11に最も多くの注文をした2人のユーザー、ユーザー1:「ショッピングの皇帝、陳哈哈...

MySQLユーザー管理操作例の分析

この記事では、MySQL ユーザー管理操作について説明します。ご参考までに、詳細は以下の通りです。こ...

Vueはデジタル千単位区切り形式をグローバルに実装します

この記事の例では、Vue がデジタル 3 桁区切り形式をグローバルに実装するための具体的なコードを参...

MySQL ステートメントロックの実装の分析

概要: 2 つの MySQL SQL ステートメント ロックの分析次のSQL文にどのようなロックが追...

JavaScript を使用したコマンドライン アプリケーションの構築

目次1. ノードをインストールする2. Commander.jsをインストールする3. JavaSc...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...

Linux で JDK をインストールして環境変数を設定する方法 (この記事で十分です)

目次1. Linuxのビット数を確認する2. JDKをダウンロードする3. JDKをインストールする...