目次
3. EventEmitter インターフェイスのエラーイベントを利用する
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)
});