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 を使用します

推薦する

DockerでGDBを使用するときにブレークポイントを入力できない問題を解決する

質問docker で gdb を実行すると、ブレークポイントに到達しますが、ブレークポイントに入るこ...

Apache Tomcat と IDEA エディターの統合に関する詳細なチュートリアル

1. Apache Tomcat 公式サイトから Tomcat 圧縮パッケージをダウンロードします。...

ウェブデザインにおけるカラーマッチングの優れた例30選

本日は、色彩の応用に関する優れた事例を 30 件集めて、皆さんにご紹介したいと思います。これらの事例...

マウスオーバーボタンアニメーションを実現する純粋な CSS3 パート 2

前の 2 つの章を終えて、ボタンのフローティング アニメーションについて新たな理解が得られましたか?...

SQL 文における複合主キーと結合主キーに関する予備的研究

1. 複合主キーいわゆる複合主キーとは、テーブルの主キーが複数のフィールドで構成され、ビジネス上の意...

Flexレイアウトを使用してヘッドの固定コンテンツ領域のスクロールを実現する方法

ページ ヘッダーの固定レイアウトは、以前は position:fixed を使用して実装されていまし...

Robots.txtの詳細な紹介

Robots.txt はプレーンテキスト ファイルであり、Web サイト管理者は、ロボットによるアク...

CSS3 のテキストとフォントの新しい設定

テキストシャドウテキストシャドウ: 水平オフセット 垂直オフセット ぼかし色互換性: IE10+ &...

構造とプレゼンテーションの分離を理解するためのWeb標準の学習

Web 標準について議論するときに必ず話題になるのは、構造とプレゼンテーションを分離することの重要性...

MySQLのスレッド実行の急増とクエリの遅延の問題を解決する

目次背景問題の説明原因分析CPUクエリが遅い接続数分析する拡大する総括する背景新年を迎える前は、一年...

Linux システムのシャットダウンコマンドの違いと使い方の詳細な説明

Linux システムのシャットダウン コマンドは何ですか? Liangxu Tutorial Net...

HTML ウェブページの段落レイアウトと改行

Web ページの外観はレイアウトに大きく左右されます。ページ内に長い段落のテキストがある場合、通常は...

Windows 8 での ssh コマンドの使用記録

1. 仮想マシンとgit bashウィンドウを開き、接続の準備をします2. 仮想マシンでifconf...

MySQL パスワードに特殊文字が含まれている場合とコマンドラインからログインする場合

サーバーでは、データベースにすばやくログインするために、通常は mysql -hhost -uuse...

fileReader 使用時の落とし穴と解決策

目次fileReader に関する落とし穴iOS における FileReader の落とし穴 (イメ...