-
需要家ポータルの学習準備_NODEJS
-
- このコースに参加 リソースにアクセスするため
技術前提概要
1.Node.jsコールバック関数
Node.jsでの非同期プログラミングの直接の実施形態は、コールバックです。
非同期プログラミングは、達成するためにコールバックに依存していますが、コールバックを使用した後、プログラムが非同期であるとは言えません。
コールバック関数は、タスクの完了後に呼び出されます。ノードは多数のコールバック関数を使用します。すべてのノードAPIはコールバック関数をサポートしています。
たとえば、ファイルの読み取り中に他のコマンドを実行し、ファイルの読み取り後に、ファイルの内容をコールバック関数のパラメーターとして返します。このようにして、コードの実行中にファイルI/O操作をブロックしたり待機したりする必要はありません。これにより、多数の同時リクエストを処理できるNode.jsのパフォーマンスが大幅に向上します。
コールバック関数は通常、関数の最後のパラメーターとして表示されます。
function foo1 (name 、age 、callback ){ } function foo2 (value 、callback1 、callback2 ){ }
2.同期実行
main.js を作成、下記ように
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log("勉強ーーーーー"); console.log("程序执行结束!");
実行結果確認
$ node main.js 勉強ーーーーー 程序执行结束!
3.非同期実行
main.js を作成、下記ように
var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log("勉強ーーーーー"); }); console.log("程序执行结束!");
実行結果確認
$ node main.js 程序执行结束! 勉強ーーーーー
4.Node.jsイベントループ
Node.jsはシングルプロセスのシングルスレッドアプリケーションですが、V8エンジンが提供する非同期実行コールバックインターフェイスにより、これらのインターフェイスを介して大量の同時実行を処理できるため、パフォーマンスが非常に高くなります。
Node.jsのほぼすべてのAPIは、コールバック関数をサポートしています。
基本的に、Node.jsのすべてのイベントメカニズムは、デザインパターンのオブザーバーパターン(Observer)を使用して実装されます。
Node.jsシングルスレッドは、イベントオブザーバーが終了し、各非同期イベントがイベントオブザーバーを生成し、イベントが発生した場合にコールバック関数が呼び出されるまで、while(true)イベントループに入るのと似ています。
5.イベントドライバー
イベント駆動型プロセス全体がこのように実装されますが、これは非常に簡単です。オブザーバーパターンに少し似ていますが、イベントはサブジェクト(Subject)と同等であり、このイベントに登録されているすべてのハンドラーはオブザーバー(Observer)と同等です。
Node.jsには多数の組み込みイベントがあります。次のように、eventsモジュールを導入し、EventEmitterクラスをインスタンス化することで、イベントをバインドしてリッスンできます。
//イベントモジュールをインポートします varevents = require ( ' events ' ); //eventEmitterオブジェクトを作成しますvareventEmitter = newevents。EventEmitter ();
次のプログラムは、イベントハンドラーをバインドします。
//イベントとイベントハンドラーをバインドしますeventEmitter.on ( ' eventName ' 、eventHandler );
プログラムでイベントをトリガーできます。
//イベントeventEmitterをトリガーします。 emit ('eventName' );
例: 次のコードを使用してmain.jsファイルを作成します。
// events 導入 var events = require('events'); // eventEmitter 作成 var eventEmitter = new events.EventEmitter(); // event 作成 var connectHandler = function connected() { console.log('connect succ。'); // data_received event 起動 eventEmitter.emit('data_received'); } // connection 追加event eventEmitter.on('connection', connectHandler); // data_received 追加event eventEmitter.on('data_received', function(){ console.log('data recive succ'); }); // connection event起動 eventEmitter.emit('connection'); console.log("process finish。");
実行結果
$ node main.js connect succ。 data recive succ process finish
6.Node.js EventEmitter
Node.jsのすべての非同期I/O操作は、完了するとイベントキューにイベントを送信します。
Node.jsディスパッチイベントの多くのオブジェクト:net.Serverオブジェクトは、新しい接続が確立されるたびにイベントを発生させ、fs.readStreamオブジェクトは、ファイルが開かれたときにイベントを発生させます。これらのイベント生成オブジェクトはすべて、events.EventEmitterのインスタンスです。
EventEmitterクラス
イベントモジュールは、events.EventEmitterという1つのオブジェクトのみを提供します。EventEmitterの中核は、イベントトリガーおよびイベントリスナー関数のカプセル化です。
このモジュールには、require( "events");を使用してアクセスできます。
//イベントモジュールをインポートします var events = require ('events'); //eventEmitterオブジェクトを作成します var eventEmitter = newevents.EventEmitter();
インスタンス化中にエラーが発生した場合、EventEmitterオブジェクトはエラーイベントを発生させます。newListenerイベントは、新しいリスナーが追加されたときに発生し、removeListenerイベントは、リスナーが削除されたときに発生します。
以下では、簡単な例を使用してEventEmitterの使用法を説明します。
//event.js ファイル var EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); event.on('some_event', function() { console.log('some_event 起動'); }); setTimeout(function() { event.emit('some_event'); }, 1000);
序号 | 方法 | descrption |
---|---|---|
1 | addListener(event, listener) | 指定されたイベントのリスナーをリスナー配列の最後に追加します。 |
2 | on(event, listener) | 指定されたイベントのリスナーを登録し、文字列イベントとコールバック関数を受け入れます。 |
3 | once(event, listener) | 指定されたイベントに対して単一のリスナーを登録します。つまり、リスナーは最大で1回だけトリガーされ、リスナーはトリガーされた直後に閉じられます。 |
4 | removeListener(event, listener) | 指定されたイベントのリスナーを削除します。リスナーは、イベントの登録済みリスナーである必要があります。2つのパラメーターを受け入れます。最初のパラメーターはイベント名で、2番目のパラメーターはコールバック関数名です |
5 | removeAllListeners([event]) | すべてのイベントのすべてのリスナーを削除します。イベントが指定されている場合、指定されたイベントのすべてのリスナーを削除します。 |
6 | setMaxListeners(n) | デフォルトでは、10を超えるリスナーを追加すると、EventEmittersは警告メッセージを出力します。setMaxListeners関数は、リスナー数のデフォルトの制限を変更するために使用されます。 |
7 | listeners(event) | 指定されたイベントのリスナーの配列を返します。 |
8 | emit(event, [arg1], [arg2], [...]) | リスナーの順序で各リスナーを実行し、イベントにリスナーが登録されている場合はtrueを返し、それ以外の場合はfalseを返します。 |
7.Node.js Buffer
JavaScript言語自体には、バイナリデータ型ではなく、文字列データ型のみがあります。
ただし、TCPやファイルストリームなどのストリームを処理する場合は、バイナリデータを使用する必要があります。したがって、Node.jsでは、バッファクラスが定義されています。これは、バイナリデータの格納専用のバッファ領域を作成するために使用されます。
Node.jsでは、BufferクラスはNodeカーネルに付属するコアライブラリです。バッファライブラリはNode.jsに生データを保存する方法をもたらし、Node.jsがバイナリデータを処理できるようにします。Node.jsのI/O操作で移動するデータを処理する必要があるときはいつでもバッファライブラリを使用できます。生データはBufferクラスのインスタンスに保存されます。バッファは整数の配列に似ていますが、V8ヒープメモリの外部にある生のメモリの一部に対応します。
buf = Buffer.alloc(256); len = buf.write("www.XXXXXX.com"); console.log("length : "+ len);
$node main.js length : 14
8.Node.js Stream
Streamは抽象インターフェースであり、Nodeの多くのオブジェクトがこのインターフェースを実装しています。たとえば、httpサーバーへの要求を開始する要求オブジェクトは、Streamおよびstdout(標準出力)です。
Node.js、Streamには4つのストリームタイプがあります。
読み取り可能-読み取り可能な操作。 書き込み可能-書き込み可能な操作。 デュプレックス-読み取りおよび書き込み操作。 変換-操作がデータに書き込まれ、結果が読み取られます。 すべてのStreamオブジェクトはEventEmitterのインスタンスです。一般的なイベントは次のとおりです。 data-読み取るデータがある場合に発生します。 end-読み取るデータがなくなったときに発生します。 error-受信および書き込み中にエラーが発生したときに発生します。 finish-すべてのデータが基盤となるシステムに書き込まれたときに発生します。 このチュートリアルでは、一般的に使用されるストリーム操作を紹介します。
次のコードを使用してmain.jsファイルを作成します。
var fs = require ("fs" ); var data = '' ; //読み取り可能なストリームを作成します var readerStream = fs .createReadStream (' input.txt ' ); //エンコーディングをutf8に設定します。 readerStream .setEncoding (' UTF8' ); //ストリームイベントを処理する->data、end、and error readerStream .on (' data ' 、function (chunk ){ data + = branch ; }); readerStream .on (' end' 、function (){ console .log (data ); }); readerStream .on ( ' error ' 、function (err ){ console .log (err .stack ); } ); console .log ("プログラムの実行が完了しました" );
9.Node.jsモジュールシステム
Node.jsファイルが相互に呼び出すために、Node.jsは単純なモジュールシステムを提供します。
モジュールはNode.jsアプリケーションの基本コンポーネントであり、ファイルとモジュールの間には1対1の対応があります。つまり、Node.jsファイルはモジュールであり、JavaScriptコード、JSON、またはコンパイルされたC /C++拡張機能である可能性があります。
インポートモジュール Node.jsでは、モジュールの導入は非常に簡単です。次のように、main.jsファイルを作成し、helloモジュールをインポートします。コードは次のとおりです。
var hello = require ('./hello' ); hello .world ();
サーバー側のモジュールはどこにありますか
お気づきかもしれませんが、コードではすでにモジュールを使用しています。このような:
var http = require ("http" ); ... http .createServer (...);
Node.jsにはhttp というモジュールが付属しています。コードでそれをリクエストし、戻り値をローカル変数に割り当てます。
これにより、ローカル変数がhttpモジュールによって提供されるすべてのパブリックメソッドを持つオブジェクトに変わります。
Node.jsのrequireメソッドでのファイル検索戦略は次のとおりです。
Node.jsには4種類のモジュール(ネイティブモジュールと3ファイルモジュール)があるため、requireメソッドは非常に単純ですが、内部読み込みは非常に複雑で、読み込みの優先順位も異なります。以下に示すように:
10.Node.js Method
JavaScriptでは、関数を別の関数の引数として使用できます。最初に関数を定義してから渡すことも、パラメーターが渡される場所で関数を直接定義することもできます。
Node.jsでの関数の使用は、JavaScriptに似ています。たとえば、次のように実行できます。
function say(word) { console.log(word); } function execute(someFunction, value) { someFunction(value); } execute(say, "Hello");
Anonymous Method
関数を変数として渡すことができます。ただし、この「最初に定義してから渡す」円を回る必要はありません。この関数を定義して、別の関数の括弧内に直接渡すことができます。
function execute(someFunction, value) { someFunction(value); } execute(function(word){ console.log(word) }, "Hello");
11. Node.js Router
ルートに要求されたURLとその他の必要なGETおよびPOSTパラメーターを提供する必要があります。次に、ルートはこのデータに基づいて適切なコードを実行する必要があります。
したがって、HTTPリクエストを確認し、リクエストされたURLとGET/POSTパラメータをそこから抽出する必要があります。この関数がルーティングに属するのかサーバーに属するのか(またはモジュール自体の関数としても)は確かに議論する価値がありますが、ここでは暫定的にHTTPサーバーの関数であると想定します。
必要なすべてのデータは、onRequest()コールバック関数の最初のパラメーターとして渡されるリクエストオブジェクトに含まれます。ただし、このデータを解析するには、追加のNode.JSモジュール、それぞれurlモジュールとquerystringモジュールが必要です。
url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- ----- | | | | querystring.parse(queryString)["foo"] | | querystring.parse(queryString)["hello"]
起動server
server.js
var http = require("http"); var url = require("url"); function start() { function onRequest(request, response) { var pathname = url.parse(request.url).pathname; console.log("Request for " + pathname + " received."); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start;
router.js
function route(pathname) { console.log("About to route a request for " + pathname); } exports.route = route;
index.js
var server = require("./server"); var router = require("./router"); server.start(router.route);
起動結果
$ node index.js Server has started.
12. Global Object
JavaScriptには、グローバルオブジェクトと呼ばれる特別なオブジェクトがあります。このオブジェクトとそのすべてのプロパティには、プログラム内のどこからでもアクセスできます。つまり、グローバル変数です。
ブラウザのJavaScriptでは、通常、ウィンドウはグローバルオブジェクトですが、Node.jsでは、グローバルオブジェクトはグローバルであり、すべてのグローバル変数(グローバル自体を除く)はグローバルオブジェクトのプロパティです。
Node.jsでは、アプリケーションに含めることなく、グローバルプロパティに直接アクセスできます。
__filename
__filenameは、現在実行中のスクリプトのファイル名を表します。ファイルが配置されている絶対パスを出力しますが、必ずしもコマンドライン引数で指定されたファイル名と同じである必要はありません。モジュール内の場合、戻り値はモジュールファイルへのパスです。
__dirname
__dirnameは、現在実行中のスクリプトが配置されているディレクトリを示します。
setTimeout(cb、ms)
setTimeout(cb、ms)グローバル関数は、指定されたミリ秒数(ms)の後に、指定された関数(cb)を実行します。:setTimeout()は、指定された関数を1回だけ実行します。
タイマーを表すハンドル値を返します。
clearTimeout(t)
clearTimeout(t)グローバル関数は、以前にsetTimeout()で作成されたタイマーを停止するために使用されます。パラメータtは、setTimeout()関数によって作成されたタイマーです。
setInterval(cb、ms)
setInterval(cb、ms)グローバル関数は、指定されたミリ秒数(ms)の後に、指定された関数(cb)を実行します。
タイマーを表すハンドル値を返します。clearInterval(t)関数を使用して、タイマーをクリアできます。
setInterval()メソッドは、clearInterval()が呼び出されるか、ウィンドウが閉じられるまで、関数を呼び出し続けます。
console
consoleは、コンソール標準出力を提供するために使用されます。これは、Internet ExplorerのJScriptエンジンによって提供されるデバッグツールであり、徐々にブラウザの実装標準になりました。
Node.jsはこの標準に準拠しており、文字を標準出力ストリーム(stdout)または標準エラーストリーム(stderr)に出力するための通常の動作をコンソールオブジェクトに提供します。
process
processはグローバル変数であり、グローバルオブジェクトのプロパティです。
これは、現在のNode.jsプロセスの状態を記述するために使用されるオブジェクトであり、オペレーティングシステムへのシンプルなインターフェイスを提供します。通常、ネイティブコマンドラインプログラムを作成するときは、それに対処する必要があります。プロセスオブジェクトの最も一般的なメンバーメソッドのいくつかを以下に説明します。
シリアルナンバー | イベントと説明 |
---|---|
1 exit | プロセスを終了する準備ができたときに発生します。 |
2 beforeExit | ノードがイベントループを空にし、他に何もスケジュールされていない場合にこのイベントを発生させます。通常、ノードはプロセスがスケジュールされていないときに終了しますが、ノードが実行を継続できるように、「beforeExit」リスナーを非同期的に呼び出すことができます。 |
3 uncaughtException | このイベントは、例外がイベントループに戻ったときに発生します。モニターが例外に追加された場合、デフォルトのアクション(スタック・トレースを出力して終了)は発生しません。 |
4 Signalイベントは | プロセスがシグナルを受信したときに発生します。シグナルのリストについては、SIGINT、SIGUSR1などの標準のPOSIXシグナル名を参照してください。 |
13.Node.jsファイルシステム
Node.jsは、UNIXライクな(POSIX)標準ファイル操作APIのセットを提供します。ノードインポートファイルシステムモジュール(fs)の構文は次のとおりです
var fs = require ("fs" )
非同期および同期 Node.jsファイルシステム(fsモジュール)モジュールのメソッドには、非同期バージョンと同期バージョンの両方があります。たとえば、ファイルの内容を読み取るための関数は、非同期fs.readFile()と同期fs.readFileSync()です。
非同期メソッド関数の最後のパラメーターはコールバック関数であり、コールバック関数の最初のパラメーターにはエラーメッセージ(エラー)が含まれています。
非同期メソッドを使用することをお勧めします。非同期メソッドは、同期メソッドよりもパフォーマンスが高く、高速で、非ブロッキングです。
var fs = require("fs"); // 非同期処理 fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("非同期read: " + data.toString()); }); // 同期処理 var data = fs.readFileSync('input.txt'); console.log("同期read: " + data.toString()); console.log("执行完了。");
$ node file.js 同期read: XXXXXXXXXXX ファイル内容 执行完了。 非同期read: XXXXXXXXXXX ファイル内容
14.Node.js GET/POST
略
15.Node.jsツールモジュール
シリアルナンバー | モジュール名と説明 |
---|---|
1 OSモジュール | 基本的なシステム操作機能を提供します。 |
2 パスモジュール | ファイルパスを操作および変換するためのツールを提供します。 |
3 Netモジュール | 低レベルのネットワーク通信に使用されます。サーバー側とクライアント側の操作を提供します。 |
4 DNSモジュール | ドメイン名を解決するために使用されます。 |
5 ドメインモジュール | 非同期コードの例外処理を簡素化し、trycatchがキャッチできないものをキャッチして処理できます。 |
16.Node.jsWebモジュール
Webサーバーとは何ですか? ウェブサーバーとは、一般的にインターネット上の特定の種類のコンピュータに常駐するプログラムを指すウェブサイトサーバーを指します。ウェブサーバーの基本的な機能は、ウェブ情報の閲覧サービスを提供することです。HTTPプロトコル、HTMLドキュメント形式、およびURLをサポートし、クライアントのWebブラウザと連携する必要があるだけです。
ほとんどのウェブサーバーはサーバーサイドスクリプト言語(php、python、ruby)などをサポートしており、スクリプト言語を介してデータベースからデータを取得し、結果をクライアントブラウザに返します。
現在、最も主流の3つのWebサーバーは、Apache、Nginx、およびIISです。
Webアプリケーションアーキテクチャ
クライアント------クライアント。----通常はブラウザを指します。ブラウザはHTTPプロトコルを介してサーバーにデータを要求できます。
サーバー------サーバーは、通常Webサーバーを指し、クライアント要求を受信し、応答データをクライアントに送信できます。
ビジネス------データベースとの対話、論理操作、外部プログラムの呼び出しなど、Webサーバーを介してアプリケーションを処理するビジネスレイヤー。
データ------データレイヤー。通常はデータベースで構成されます。
17.Node.js Express Framework
Expressの概要 Expressは、簡潔で柔軟なnode.js Webアプリケーションフレームワークであり、さまざまなWebアプリケーションの作成に役立つ一連の強力な機能と豊富なHTTPツールを提供します。
Expressを使用して、完全に機能するWebサイトをすばやく構築します。
Expressフレームワークのコア機能:
1.ミドルウェアは、HTTP要求に応答するように設定できます。
2.ルーティングテーブルは、さまざまなHTTPリクエストアクションを実行するために定義されています。
3.テンプレートにパラメータを渡すことにより、HTMLページを動的にレンダリングできます。
現在のディレクトリのnode_modulesディレクトリにExpressフレームワークをインストールし、Expressディレクトリはnode_modulesディレクトリの下に自動的に作成されます。次の重要なモジュールは、Expressフレームワークとともにインストールする必要があります。
body-parser -JSON、Raw、Text、およびURLエンコードされたデータを処理するためのNode.jsミドルウェア。
cookie-parser-これはcookieを解析するためのツールです。req.cookiesを介して、渡されたCookieを取得し、それらをオブジェクトに変換できます。
multer -enctype = "multipart / form-data"(フォームのMIMEエンコーディングを設定)でフォームデータを処理するためのNode.jsミドルウェア。
最初のExpressフレームワークインスタンス
次に、Expressフレームワークを使用して「HelloWorld」を出力します。
次の例では、エクスプレスモジュールを導入し、クライアントがリクエストを開始した後、「HelloWorld」文字列で応答します。
次のコードを使用してexpress_demo.jsファイルを作成します。
//express_demo.js var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World'); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("1111111111", host, port) })
$ node express_demo.js 1111111111 http://0.0.0.0:8081