Express開発の歴史
この記事では、Express の非同期進化の歴史を中心に紹介します。非常に優れていると思いますので、参考にしてください。エディターをフォローして一緒に見てみましょう
1. はじめに
JavaScript の世界では、非同期 (JavaScript は単一スレッドで実行されるため、JavaScript の非同期はブロックされる可能性があります) が随所に存在します。
Express は、ノード環境で非常に人気のある Web サーバー フレームワークであり、Node Web アプリケーションの大部分が Express を使用します。
JavaScript を使用してサーバーサイドのコードを記述する場合、必然的に非同期を多用することになります。 JavaScript と Node が進化するにつれて、非同期処理メソッドも進化します。
次に、Express における非同期処理の進化を見てみましょう。
2. JavaScript での非同期処理
非同期の世界では、JavaScript ではどのような方法があるのでしょうか?
2.1. コールバック
コールバックは、JS で最も独創的で最も古い非同期通知メカニズムです。
function asyncFn(callback) { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); callback(); // 发通知 }, 2000); } asyncFn(function () { console.log('我会在2s后输出'); });
2.2. イベントモニタリング
一定時間リッスンして結果を取得する関数です。非同期メソッドが完了すると、通知効果を実現するためにイベントがトリガーされます。
2.3. パブリッシュ/サブスクライブ
非同期完了時にオブザーバー パターンを使用してパブリッシャーを変更します。この時点で、発行者は購読者に変更を通知します。
2.4, Promise
Promiseはコールバック関数の改良版です。これを使用すると、非同期を並列化し、コールバック地獄を回避できます。
function asyncFn() { return new Promise((resolve, reject) => { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); resolve(); // 发通知(是否有感觉到回调的影子?) }, 2000); }); } asyncFn() .then(function () { console.log('我会在2s后输出'); });
2.5、Generator
Generator関数は、ES6によって提供される非同期プログラミングソリューションです。
次のコードは単なるデモです。実際、ジェネレーターの使用プロセスは比較的複雑なので、この記事では説明しません。
function asyncFn() { return new Promise((resolve, reject) => { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); resolve(); // 发通知(是否有感觉到回调的影子?) }, 2000); }); } function* generatorSync() { var result = yield asyncFn(); } var g = generatorSync(); g.next().value.then(()=>{ console.log('我会在2s后输出'); });
2.6、async...await
は現在JavaScriptで非同期を扱うための最良の解決策であると言えます。
function asyncFn() { return new Promise((resolve, reject) => { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); resolve(); // 发通知(是否有感觉到回调的影子?) }, 2000); }); } async function run(){ await asyncFn(); console.log('我会在2s后输出'); } run();
3. Express での非同期処理
Express で一般的に使用されるソリューションは、コールバック関数、Promise、および async...await です。
デモ環境を構築するには、express-generator を通じて Express プロジェクトを初期化します。一般に、サーバー側プロジェクトはルートを使用してビジネス ロジックを呼び出します。したがって、私たちもこの原則に従います:
routs/index.js を開くと、次の内容が表示されます。次のデモでは、このファイルをデモンストレーションに使用します。
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router;
3.1. Expressの非同期ロジックを扱うコールバック関数
Expressではルートが複数のミドルウェアをロードできるため、ミドルウェアの記述方法に従ってビジネスロジックを記述できます。このようにして、非同期ロジックを次の層に非常に簡単に分割できます。
var express = require('express'); var router = express.Router(); function asyncFn(req, res, next) { setTimeout(() => { req.user = {}; // 设置当前请求的用户 next(); }, 2000); } function asyncFn2(req, res, next) { setTimeout(() => { req.auth = {}; // 设置用户权限 next(); }, 2000); } function asyncFn3(req, res, next) { setTimeout(() => { res.locals = { title: 'Express Async Test' }; // 设置数据 res.render('index'); // 响应 }, 2000); } /* GET home page. */ router.get('/', asyncFn, asyncFn2, asyncFn3); // 一步步执行中间件 module.exports = router;
3.2. Promise 処理 Express 非同期ロジック
このソリューションでは、複数のビジネス ロジックが Promise を返す関数にパッケージ化されています。ビジネス メソッドを通じて複合コールを実行して、1 つのインと 1 つのアウトの効果を実現します。
var express = require('express'); var router = express.Router(); function asyncFn(req, res) { return new Promise((resolve, reject) => { setTimeout(() => { req.user = {}; // 设置当前请求的用户 resolve(req); }, 2000); }); } function asyncFn2(req) { return new Promise((resolve, reject) => { setTimeout(() => { req.auth = {}; // 设置用户权限 resolve(); }, 2000); }); } function asyncFn3(res) { return new Promise((resolve, reject) => { setTimeout(() => { res.locals = { title: 'Express Async Test' }; // 设置数据 res.render('index'); // 响应 }, 2000); }); } function doBizAsync(req, res, next) { asyncFn(req) .then(() => asyncFn2(req)) .then(() => asyncFn3(res)) .catch(next); // 统一异常处理 }; /* GET home page. */ router.get('/', doBizAsync); module.exports = router;
3.3. async...await は Express の非同期ロジックを処理します
実際、このソリューションには Promise のサポートも必要ですが、記述方法はより直感的で、エラー処理はより直接的です。
Express は初期のソリューションであり、async...await のグローバル エラー処理がないため、パッケージ化を使用して処理できることに注意してください。
var express = require('express'); var router = express.Router(); function asyncFn(req) { return new Promise((resolve, reject) => { setTimeout(() => { req.user = {}; // 设置当前请求的用户 resolve(req); }, 2000); }); } function asyncFn2(req) { return new Promise((resolve, reject) => { setTimeout(() => { req.auth = {}; // 设置用户权限 resolve(); }, 2000); }); } function asyncFn3(res) { return new Promise((resolve, reject) => { setTimeout(() => { }, 2000); }); } async function doBizAsync(req, res, next) { var result = await asyncFn(req); var result2 = await asyncFn2(req); res.locals = { title: 'Express Async Test' }; // 设置数据 res.render('index'); // 响应 }; const tools = { asyncWrap(fn) { return (req, res, next) => { fn(req, res, next).catch(next); // async...await在Express中的错误处理 } } }; /* GET home page. */ router.get('/', tools.asyncWrap(doBizAsync)); // 需要用工具方法包裹一下 module.exports = router;
4. 概要
ただし、koa はより新しく優れた使用法をサポートしています (koa はジェネレーター、koa2 ネイティブの非同期)。しかし、node 0.x を使い始めた人間として、私は今でも Express に特別な思い入れを持っています。
上記のソリューションの一部はすでに koa で使用されており、Express の巨大なエコシステムと組み合わせることで、さらに強力になります。
この記事のGithubアドレス
以上がExpress開発の歴史の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ファイルのアップロードをどのように処理するか?次の記事では、Express を使用してノード プロジェクトでファイルのアップロードを処理する方法を紹介します。

Express と Laravel の詳細な比較: 最適なフレームワークを選択するには?プロジェクトに適したバックエンド フレームワークを選択する場合、Express と Laravel が開発者の間で人気のある 2 つの選択肢であることは間違いありません。 Express は Node.js ベースの軽量フレームワークであり、Laravel は PHP ベースの人気のあるフレームワークです。この記事では、これら 2 つのフレームワークの長所と短所を詳しく比較し、開発者がニーズに最適なフレームワークを選択できるように、具体的なコード例を示します。パフォーマンスとスケーラビリティExpr

Express と Laravel は非常に人気のある 2 つの Web フレームワークで、それぞれ JavaScript と PHP の 2 つの主要な開発言語の優れたフレームワークを代表します。この記事では、開発者がプロジェクトのニーズにより適したフレームワークを選択できるように、これら 2 つのフレームワークの比較分析を実施します。 1. フレームワークの概要 Express は、Node.js プラットフォームに基づく Web アプリケーション フレームワークであり、開発者が高性能の Web アプリケーションを迅速に構築できるようにする一連の強力な機能とツールを提供します。急行

プログラミング言語としての Golang (略して Go 言語) は、近年ブロックチェーン分野で徐々に登場しており、その効率的な同時処理機能と簡潔な構文機能により、ブロックチェーン開発で好まれています。この記事では、Golang がブロックチェーンの開発にどのように役立つかを検討し、具体的なコード例を通じてブロックチェーン アプリケーションにおける Golang の優位性を実証します。 1. ブロックチェーン分野における Golang の利点: 効率的な同時処理機能: ブロックチェーン システムのノードは同時に大量のトランザクションとデータを処理する必要があり、Gola

タイトル:C言語の起源と発展の歴史 C言語は、システムソフトウェアやアプリケーションソフトウェアの開発に広く使われている高級プログラミング言語です。構造、モジュール性、移植性の特徴を備えており、コンピュータ分野で最も重要で人気のあるプログラミング言語の 1 つです。この記事では、C言語の起源と発展の歴史を紹介し、具体的なコード例を交えて説明します。 1. C 言語の起源 C 言語の歴史は、ベル研究所のデニス・リッチーとケン・トンプソンが開発した 1969 年に遡ります。

科学技術の急速な発展と教育分野における情報技術の広範な応用に伴い、Canvas は世界をリードするオンライン学習管理システムとして、中国の教育業界で徐々に台頭してきています。 Canvas の登場は、中国の教育と指導方法の改革に新たな可能性をもたらします。この記事では、中国の教育分野におけるCanvasの開発傾向と展望について探っていきます。まず第一に、中国の教育分野における Canvas の開発トレンドの 1 つは、徹底した統合です。クラウド コンピューティング、ビッグ データ、人工知能の急速な発展により、Canvas はますます

Go 言語とも呼ばれる Golang は、Google によって開発されたプログラミング言語で、同時プログラミングおよびネットワーク プログラミング用の高レベル プログラミング言語です。近年、クラウドコンピューティング技術の急速な発展に伴い、クラウドコンピューティング分野におけるGolangの応用が徐々に注目を集めている。この記事では、Golang がクラウド コンピューティングの開発にどのように役立つかを検討し、具体的なコード例を通じてクラウド コンピューティングの分野での Golang の利点とアプリケーションを説明します。 1. クラウド コンピューティングにおける Golang の利点 同時プログラミング機能: Golang は強力な同時実行性を備えて生まれています。

ChatGPT から AI 描画テクノロジーに至るまで、人工知能分野における最近の進歩の波は、Transformer のおかげかもしれません。今日は、有名な変圧器論文の提出から 6 周年です。論文リンク:https://arxiv.org/abs/1706.03762 6年前、プレプリント論文プラットフォームarXivに少々大げさな名前の論文がアップロードされ、「xxisAllYouNeed」というフレーズがAI分野の開発者の間で常用されていました。論文のタイトルでもリテリングがトレンドになっており、トランスフォーマーはもはやトランスフォーマーを意味するものではなく、AI分野における最先端技術を意味するようになりました。 6年後、この論文を振り返ってみると
