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

推薦する

JavaScript ウェブページ入門開発詳細説明

パート3: ❤バックエンドデータ受信を見落とす3つの方法❤ (おすすめ集)パート 2: Web フォ...

Vue パッケージアップロードサーバー更新 404 問題に対する 2 つの解決策

1: nginxサーバーソリューション、.conf構成ファイルを変更する解決策は2つある1: 位置 ...

HTML 再利用テクニック

HTML の再利用は、あまり話題に上らない言葉です。今日は、この問題を次のようにまとめたいと思います...

Linux 環境に mysql5.7.36 データベースをインストールするチュートリアル

ダウンロードアドレス: https://dev.mysql.com/downloads/mysql/...

Linux で nohup ログ出力が大きすぎる問題の解決方法の詳細な説明

最近、hadoop テスト クラスターで spark ストリーミング プログラムを実行し、その後、n...

MySQL で高性能なインデックスを作成するための完全な手順

目次1. インデックスの基本1. インデックスの種類1.1 Bツリーインデックス1.2 ハッシュイン...

Vue + OpenLayers クイックスタートチュートリアル

Openlayers は、WebGIS クライアント向けのモジュール式で高性能かつ機能豊富な Jav...

HTML テーブル マークアップ チュートリアル (29): セルのライト境界線の色属性 BORDERCOLORLIGHT

セルでは、明るい境界線の色を個別に定義できます。 > 基本構文<TD ボーダーカラーライ...

CSS--overflow:hidden のプロジェクト例

以下は、私のプロジェクトでこのプロパティを使用する方法の例です。 (1)激しく透明な浮遊コードをコピ...

TOM.COMのホームページリニューアルの経験

<br />何の警告もなく、cnBeta で TOM.COM の Web サイトが再設計...

Vue スキャフォールディングでのレンダリングを理解する

Vue スキャフォールディングでは、エントリ ファイル main.js の新しい Vue コードに、...

CSSに基づいてマウス入力の方向を決定する

以前、フロントエンド技術グループに所属していたとき、グループのメンバーが面接中に問題に遭遇したと言っ...

JS関数のカリー化の詳細な説明

目次1. 補足知識ポイント: 関数の暗黙的な変換2. 補足知識: call/apply を使って配列...

HTML テーブルの使い方 (Web ページの視覚効果を表示する)

NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...

MySQL の基本ステートメントを最適化するための 10 の原則の概要

序文データベースの応用において、プログラマーは継続的な実践を通じて多くの経験を積んできました。これら...