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

推薦する

フロントエンドJSサンドボックスを実装するいくつかの方法についての簡単な説明

目次序文iframeはサンドボックスを実装しますdiffメソッドを使用したサンドボックスの実装プロキ...

MAC 上の MySQL の初期パスワードを忘れた場合の対処方法

MACでMySQLの初期パスワードを忘れた問題を解決する方法を参考までに共有します。具体的な内容は次...

JavaScript キャンバスはマウスの動きに合わせてボールを動かすことを実装します

この記事の例では、マウスに従ってボールを動かすjsの具体的なコードを参考までに共有しています。具体的...

CSS を使用して親コンテナ div を img 画像で埋め、コンテナのサイズを調整する方法

ページに複数の画像を導入すると、画像のサイズがばらつくことがあります。しかし、それらを一貫したサイズ...

Linux で MySQL 5.7.19 をアンインストールする方法

1. MySQLが以前にインストールされていたかどうかを確認するコマンド: rpm -qa|grep...

Docker を使用して pypi プライベート リポジトリを構築する方法

1. 建設1. htpasswd.txtファイルを準備するファイルには、パッケージを倉庫にアップロー...

JavaScript Canvas は動的なワイヤーフレーム効果を描画します

この記事では、JavaScript Canvasの動的なワイヤーフレーム効果を描画する具体的なコード...

mysql 10進データ型変換の実装

最近、次のデータ型のデータベースに遭遇しました:decimal(14,4)発生した問題は次のとおりで...

DockerToolBox ファイルマウント実装コード

docker を使用すると、ファイルをマウントできない場合があります。これは、仮想マシンの共有フォル...

MySQL で削除されたレコードが有効にならない理由のトラブルシューティング

オンライン MySQL トランザクションの問題の記録先週の金曜日、大きなテーブルを削除する操作を実行...

HTML ページをズームアウトした後にスクロール バーを表示するためのサンプル コード

ここでは、HTML ページのサイズを縮小した後に下部にスクロール バーを表示し、スクロール バーをス...

すべてのホストがmysqlにアクセスできるようにする方法

1. MySQLデータベースのユーザーテーブルのレコードのHostフィールド値を%に変更します。奇妙...

Node.jsサービスDockerコンテナアプリケーション実践のまとめ

この記事では、Docker コマンドの使用とインストールについては説明しません。Docker を基礎...

Windows 8 での MySQL 5.6.15 のインストールと設定方法のグラフィック チュートリアル

MySQLは私がとても気に入っているデータベースです。今日はWindows 8システムでインストール...

Linux での MySQL のインストールに関するチュートリアル

目次1. 古いバージョンを削除する2. サーバーのカーネルタイプを確認し、適切なバージョンをダウンロ...