NodeJS 例外処理と組み込みモジュールの紹介

目次

1.nodejsの紹介

二、REPL環境

3.nodejsモジュールシステム

1. CommonJS モジュール化

2.ECMAScript モジュール

4. 例外処理 

1. try-catch キャプチャ例外

2. コールバック関数を使用して例外をキャッチする

3. EventEmitter インターフェイスのエラーイベントを利用する

5. 組み込みモジュール

1. http モジュール

2. fs モジュール

3. URL モジュール

url.parse() 

編集

url.format() 

url.resolve(から、へ) 

4.クエリ文字列モジュール 

5.パスモジュール

6.ユーティリティモジュール

util.callbackify()


1.nodejsの紹介

NodeJS は 2009 年に誕生しました。NodeJS はオープン ソースでクロスプラットフォームの JavaScript ランタイム環境であり、Node.js または Node とも呼ばれます。
いわゆる「動作環境」には、次の 2 つの意味があります。
まず、JavaScript 言語は Node を介してサーバー上で実行されます. この意味で、Node は JavaScript 仮想マシンに少し似ています。
次に、Node は、JavaScript 言語がオペレーティング システムとやり取りできるようにするための多数のツール ライブラリを提供します (ファイルの読み取りと書き込み、サブプロセスの作成など)。この意味で、Node は JavaScript 用のツール ライブラリでもあります。
Node は内部的に Google の V8 エンジンを JavaScript 言語インタープリターとして使用し、自社開発の libuv ライブラリーを介してオペレーティング システム リソースを呼び出します。

二、REPL環境

Node.js REPL ( Read Eval Print Loop: Interactive Interpreter) は、Windows ターミナルや Unix/Linux シェルに似たコンピューター環境を表し 、ターミナルでコマンドを入力してシス​​テムからの応答を受け取ることができます。
nodeコマンドを使用してNodeJSソフトウェアのREPL  環境 に入り REPL環境 で次のタスクを実行します。
読み取り (読み取り) - ユーザー入力を読み取り、入力 Javascript データ構造を解析してメモリに保存します
実行 (評価) -  入力データ構造を実行する
印刷 (印刷) - 結果を出力する
ループ - ユーザーが ctrl+c ボタンを 2 回押して終了するまで、上記の手順をループします。
ctrl+c を 2 回押して終了するか、ctrl+d を押して終了します。

3.nodejsモジュールシステム

モジュールのルート ディレクトリで npm initコマンドを使用して、 package.jsonファイル を生成します .package.jsonはモジュールのマニフェスト ファイルであり、現在のモジュールの基本情報と依存関係情報を記録します.
バージョン モジュール バージョン
名前 モジュール名
説明モジュールの説明
メインエントリファイル
private true に設定すると、アプリケーション / パッケージが誤って npm に公開されるのを防ぎます
scripts                     脚本
依存関係 製品の依存関係
devDependencies 開発依存関係
エンジン nodejs バージョン番号
browserslist サポートされているブラウザー
初期の Javascript (ECMAScript5) にはモジュール性がありませんでしたが、 NodeJSのリリース後 、CommonJS モジュール仕様が使用されました。その後、 ECMAScript のモジュール化は ES6 の出現後に登場し ECMAScript のモジュール化はnode-v12以降で使用できます

1. CommonJSモジュール化

CommonJS は、各ファイルが独自のスコープを持つモジュールであることを規定しています。ファイルで定義された変数、関数、およびクラスはすべてプライベートであり、他のファイルからは見えません。
CommonJS モジュール化では、module.exports を使用してモジュールをエクスポートし、require メソッドを使用してモジュールをインポートします. require メソッドを使用して、組み込みモジュール、ローカル ファイル、またはサードパーティの依存関係をインポートできます。
require('http'); //内置模块
require('./xxx.js'); //文件
require('lodash'); //第三方依赖 需要下载

2.ECMAScriptモジュール_

ES6 では 、各モジュールはファイルであり、ファイルで定義されている変数、関数、およびオブジェクトは外部から取得できません。モジュール内のコンテンツを外部から読み取れるようにする場合は、 export を使用して 公開 ( output ) する必要があります。export コマンドは、モジュール内の変数と 1 対 1 の対応を確立する必要がある外部インターフェイスを指定します。つまり、外部インターフェイスは、このインターフェイス名によって参照される必要があります。静的 インポート ステートメントは、別のモジュールによってエクスポートされたバインディングをインポートするために使用されます。
es6 モジュール化を使用する場合、package.json にコードを追加する必要があります: type: "module"

 

4. 例外処理 

Node はシングル スレッドの動作環境であり、例外がスローされてキャッチされない場合、プロセス全体がクラッシュします。したがって、ノードの例外処理は、 システムの安定した動作を確保するために非常に重要です。

1. try-catch キャプチャ例外

try{
  console.log(a);
}catch(err){
  console.log(err,'捕获异常');
}
let b = 1
console.log(b);

結果は次のとおりです。

一般的に言えば、 Node は、 JSON.parse を使用して JSON テキストを解析するなど、まれに しか try/catchステートメントを使用しません この構造体は、非同期で実行されるコードによってスローされた例外をキャッチできません。
try{
  setTimeout(()=>{
    console.log(a);
  },0)
}catch(err){
  console.log(err,'捕获异常');
}
let b = 1
console.log(b);

結果は次のとおりです。

 実行結果の例外は、try-catch ではキャッチされず、setTimeout 内までコード実行されます。

2. コールバック関数を使用して例外をキャッチする

Nodeで採用されている方法 は、エラー オブジェクトを最初のパラメーターとしてコールバック関数に渡すことです。これにより、キャッチ コードがエラー コードと同じ期間にないという問題が回避されます。
let fs = require('fs')
fs.readFile('1.txt',function(err,data){
  if(err) throw err
  console.log(data.toString());
})

3. EventEmitterインターフェイスエラーイベントを利用する

エラーが発生した場合、 EventEmitterインターフェイスを使用して エラーイベント をスローすることもできます
let {EventEmitter} = require('events');
let emitter = new EventEmitter
// 使用on绑定事件 on(事件名,事件处理程序)
emitter.on('error',function(err){
  console.log(err.message);
})
// 触发事件
emitter.emit('error',{message:'出错了'})
emitter.emit('error',new Error('发生了错误'))

5. 組み込みモジュール

nodejs の組み込みモジュールをダウンロードする必要はなく、require メソッドを使用してインポートするだけで済みます。

1. http モジュール

http サーバーを作成します。
最初のステップ: http モジュールを導入するために require メソッドを使用します。

let http = require("http")

ステップ 2: サーバーを作成する

http.createServer()メソッド を使用して サーバーを作成し、 listen メソッドを使用してポート 8888 をバインドします この関数は、要求パラメーターと応答パラメーターを介してデータを受信し、応答します
let http = require('http')
http.createServer(function(request,response){
  //request请求对象  response响应对象
  // 发送http头部  返回json格式的数据
  response.writeHead('200',{'Content-Type':'application/json'})
  // 发送响应数据 
  response.end(JSON.stringify('Hello World'))
}).listen(8888)
// 终端打印
console.log('server is running http://127.0.0.1:8888')
プロセスを終了するには、process.exit() を使用します。

2. fs モジュール

fsは filesystemの略語 です . このモジュールは, ローカルファイルを読み書きする機能を提供します. このモジュールは, 開発者が選択できるほとんどすべての操作に対して, 非同期と同期の 2 つの操作モードを提供します.
readFile() は                  ファイルを非同期的に読み取ります
readFileSync() は          ファイルを同期的に読み取ります
writeFile() は                  ファイルを非同期的に書き込みます
writeFileSync() は          同期的にファイルを書き込みます
         ファイルが存在するかどうかを判断するstat()、access()
mkdir(path[, options], callback)             ディレクトリを非同期的に作成
mkdirSync(path[, options])                    ディレクトリを同期的に作成する
readdir(path[, options], callback)           ディレクトリの内容を読む
readdirSync(path[, options])                   ディレクトリの内容を同期的に読み取る
let fs = require('fs');

// 同步读取文件 阻塞代码
let data = fs.readFileSync('笔记.txt', 'utf-8');
console.log(data); //buffer实例 

// 异步读取文件 非阻塞代码
fs.readFile('笔记.js', 'utf-8', (err, data) => {
  if (err) throw err
  console.log(data)
});
console.log('123');

let res = fs.readFileSync('笔记.txt', 'utf-8');
// 异步写入文件   res + '写入的内容'-->可以避免原先内容被覆盖
fs.writeFile('笔记.txt', res + '写入的内容', (err) => {
  if (err) throw err
  console.log('写入成功')
});

// 同步写入文件
fs.writeFileSync('笔记.txt', 'hello 写入内容', 'utf8');
console.log('写入成功');

// fs 判断文件是否存在 
fs.stat('笔记.txt', (err, stats) => {
  console.log(err ? '文件不存在' : '文件存在')
})
fs.access('笔记.txt', (err) => {
  console.log(err ? '文件不存在' : '文件存在')
})

// 创建目录 异步创建  {recursive:true}设置递归创建 
fs.mkdir('./test/a/b', {
  recursive: true
}, (err) => {
  if (err) throw err;
  console.log('创建成功')
});

// 读取目录  ..表示上一级目录
fs.readdir('..', (err, files) => {
  if (err) throw err
  console.log(files, '读取成功')
});

3. URL モジュール

URL リクエスト アドレスを解析する

parse は           URL文字列アドレスをURLオブジェクトに変換します

format は          URL文字列を作成します

         マージ URL文字列の解決

url.parse() 

URL文字列アドレスをURLオブジェクト変換する

let url = require('url');
let res = url.parse('http://admin1:[email protected]:8080/user/login?page=1&pageSize=10#hash');
console.log(res);

結果は次のとおりです。

url.format() 

URL 文字列を作成する
let url = require('url');
let res = url.parse('http://admin1:[email protected]:8080/user/login?page=1&pageSize=10#hash');
console.log(url.format(res)); //http://admin1:[email protected]:8080/user/login?page=1&pageSize=10#hash

url.resolve(から、へ) 

URL 文字列をマージする
const url = require('url');
console.log(url.resolve('/one/two/three', 'four'));// '/one/two/four'
console.log(url.resolve('http://example.com/', '/one'));// 'http://example.com/one'
console.log(url.resolve('http://example.com/one', '/two'));// 'http://example.com/two'

ドット構文を使用して、url オブジェクトのプロパティを取得し、その値を変更できます。

const myUrl = new URL('http://121.199.0.35:8888/user/login?page=1&pageSize=10');
console.log(myUrl);
console.log(myUrl.searchParams); //获取
myUrl.port = 8080 //修改

myUrl は結果を出力します:

4.クエリ文字列モジュール 

このモジュールは、クエリ文字列を処理するために使用されます
parse                 は、クエリ文字列をオブジェクトに解析します
stringify は             オブジェクトをクエリ文字列にシリアライズします
エスケープは              クエリ文字列をエンコードします
unescape は         クエリ文字列をデコードします
let qs = require('querystring');
// 1.parse 将查询字符串转换成对象
let name = 'name=张三&age=18';
console.log(qs.parse(name)); //{ name: '张三', age: '18' }
// 2.stringify 将对象转成查询字符串 
console.log(qs.stringify({
  page: 1,
  pageSize: 10
})); //page=1&pageSize=10
// 3.escape 对查询字符串编码 
console.log(qs.escape('name=张三&age=18')); //name%3D%E5%BC%A0%E4%B8%89%26age%3D18
// 4.unescape 对查询字符串解码
console.log(qs.unescape('name%3D%E5%BC%A0%E4%B8%89%26age%3D18')) //name=张三&age=18

5.パスモジュール

パスを解決するために使用されます

basename は          パスの最後の部分を返します
dirname は、             ディレクトリを表すパスの一部を返します
extname は、             パス内のファイルのサフィックス名を返します
parse は                  パス文字列のオブジェクトを返します
format は、                 path.parse とは逆に、オブジェクトからパス文字列を返します。
isAbsolute は、 パラメーター パスが絶対パスかどうかを          判別します
join                      複数のアドレスをつなぎ、「.」「..」を認識できる
            標準化されたパスを正規化し、「.」「..」を認識できます
relative    は、絶対パスを相対パスに変換するために使用され、 からから への 相対 パスを返します ( 現在の作業ディレクトリに基づく )
resolve     は絶対パスに解決され、指定された一連のパスが右から左に処理され、 絶対パスが構築されるまで後続の各 パスが順番に解析され ます。
sepプラットフォーム         のファイル パス セパレータ、 '\' または '/'
win32 は、 上記のパスの       メソッドを含むオブジェクトを提供します が、常に win32 互換の方法で対話します
posix は、 上記のパス のメソッドを含むオブジェクト       を提供します
Delimiter  パス区切り文字、 Linux オペレーティング システムの区切り文字は 「:」 Windows オペレーティング システムの区切り文字は 「;」
let path=require('path');
// 文件路径
let name='C:/nodejs/hello.html';
// basename 方法返回path路径的最后一部分 文件路径 最后一部分路径文件拓展名
console.log(path.basename(name)); //hello.html
console.log(path.basename(name,'.html')); //hello
// dirname 方法返回文件夹 部分
console.log(path.dirname(name)); //C:/nodejs
// extname 方法 文件后缀名
console.log(path.extname(name)); //.html
// // parse 方法 解析
console.log(path.parse(name)); //{root: 'C:/', dir: 'C:/nodejs', base: 'hello.html', ext: '.html', name: 'hello' }
console.log(path.isAbsolute(name)); //true
console.log(path.isAbsolute('./1.js')); //false

console.log(path.relative('/admin/user/day01','/admin/user/day02'));//..\day02

console.log(path.win32===path); //true
console.log(path.posix===path) //false

6.ユーティリティモジュール

util.callbackify()

async 非同期関数 ( または Promiseを返す 関数 )を 、最後のパラメーター として (err, value) => ... callback などの例外ファースト コールバック スタイルに従う関数に 変換します。 コールバック関数では、最初のパラメーターは拒否の理由 ( Promise が解決される 場合はnull )であり、2 番目のパラメーターは解決された値です。
let util = require('util');
async function a() {
  console.log('我被执行了')
};
// 返回一个回调函数
let callback = util.callbackify(a);
callback((err, data) => {
  if (err) console.log(err);
  console.log(data)
});

おすすめ

転載: blog.csdn.net/lq313131/article/details/127448148
おすすめ