Express開発の歴史

Sep 11, 2017 am 10:09 AM
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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Mar 28, 2023 pm 07:28 PM

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

Express と Laravel の詳細な比較: 最適なフレームワークを選択するには? Express と Laravel の詳細な比較: 最適なフレームワークを選択するには? Mar 09, 2024 pm 01:33 PM

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

Express と Laravel の比較分析: より自分に合ったフレームワークを選択してください Express と Laravel の比較分析: より自分に合ったフレームワークを選択してください Mar 10, 2024 pm 10:15 PM

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

ブロックチェーンの開発における Golang の影響と役割に関する研究 ブロックチェーンの開発における Golang の影響と役割に関する研究 Feb 26, 2024 pm 04:24 PM

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

C言語の起源と発展の歴史 C言語の起源と発展の歴史 Mar 18, 2024 pm 06:48 PM

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

中国教育分野におけるCanvasの発展動向と将来展望 中国教育分野におけるCanvasの発展動向と将来展望 Jan 17, 2024 am 10:22 AM

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

クラウド コンピューティングにおける Golang のパワーを発見する クラウド コンピューティングにおける Golang のパワーを発見する Feb 26, 2024 pm 01:00 PM

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

Transformer 6 周年: 当時は NeurIPS Oral さえ入手できませんでしたが、8 人の著者が複数の AI ユニコーンを設立しました Transformer 6 周年: 当時は NeurIPS Oral さえ入手できませんでしたが、8 人の著者が複数の AI ユニコーンを設立しました Jun 14, 2023 pm 01:18 PM

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

See all articles