Heim >Web-Frontend >js-Tutorial >Express-Entwicklungsgeschichte

Express-Entwicklungsgeschichte

巴扎黑
巴扎黑Original
2017-09-11 10:09:282118Durchsuche

Dieser Artikel stellt hauptsächlich die Geschichte der asynchronen Entwicklung von Express vor. Der Herausgeber findet ihn ziemlich gut. Jetzt werde ich ihn mit Ihnen teilen und als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf Betrieb von JavaScript, sodass Async in JavaScript blockieren kann) ist überall.

Express ist ein sehr beliebtes Webserver-Framework in der Node-Umgebung. Ein großer Teil der Node-Webanwendungen verwendet Express. Wenn wir JavaScript zum Schreiben von serverseitigem Code verwenden, werden wir zwangsläufig häufig Asynchronität verwenden. Mit der Weiterentwicklung von JavaScript und Node werden sich auch unsere asynchronen Verarbeitungsmethoden weiterentwickeln. Als nächstes werfen wir einen Blick auf die Entwicklung der asynchronen Verarbeitung in Express.

2. Asynchrone Verarbeitung von JavaScript

In der asynchronen Welt müssen wir einen Weg finden, die Benachrichtigung über den Abschluss zu erhalten asynchrone Methode, was sind dann die Methoden in JavaScript?

2.1. Rückruf Rückruf ist der originellste und älteste asynchrone Benachrichtigungsmechanismus in JS.

2.2. Ereignisüberwachung

Funktion, um das Ergebnis zu erhalten, eine bestimmte Zeit lang abhören. Nachdem die asynchrone Methode abgeschlossen ist, wird das Ereignis ausgelöst, um den Benachrichtigungseffekt zu erzielen.

function asyncFn(callback) {
 // 利用setTimeout模拟异步
 setTimeout(function () {
  console.log('执行完毕');
  callback(); // 发通知
 }, 2000);
}

asyncFn(function () {
 console.log('我会在2s后输出');
});
2.3. Veröffentlichen/Abonnieren

Verwenden Sie den Beobachtermodus, um den Herausgeber zu ändern, wenn der asynchrone Abschluss erfolgt. Zu diesem Zeitpunkt wird der Herausgeber die Abonnenten über die Änderungen informieren.

2.4, Promise

Promise ist eine Verbesserung der Callback-Funktion. Auf diese Weise können wir die Asynchronität parallelisieren und die Callback-Hölle vermeiden.

2.5. Generator

Die Generatorfunktion ist eine von ES6 bereitgestellte asynchrone Programmierlösung.

Der folgende Code ist nur eine einfache Demonstration. Tatsächlich ist der Verwendungsprozess von Generator relativ kompliziert. Dies ist ein anderes Thema und wird in diesem Artikel nicht behandelt.
function asyncFn() {
 return new Promise((resolve, reject) => {
  // 利用setTimeout模拟异步
  setTimeout(function () {
   console.log('执行完毕');
   resolve(); // 发通知(是否有感觉到回调的影子?)
  }, 2000);
 });
}

asyncFn()
 .then(function () {
  console.log('我会在2s后输出');
 });

2.6, async...await

kann als die beste Lösung für den Umgang mit asynchronem Strom angesehen werden JavaScript.

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后输出');
});

3. Asynchrone Verarbeitung in Express


In Express verwenden wir im Allgemeinen das Beste Lösungen sind: Callback-Funktion, Promise und Async...await.
function asyncFn() {
 return new Promise((resolve, reject) => {
  // 利用setTimeout模拟异步
  setTimeout(function () {
   console.log('执行完毕');
   resolve(); // 发通知(是否有感觉到回调的影子?)
  }, 2000);
 });
}

async function run(){
 await asyncFn();
 console.log('我会在2s后输出');
}

run();

Um eine Demonstrationsumgebung zu erstellen, initialisieren Sie ein Express-Projekt über den Express-Generator. Im Allgemeinen verwenden serverseitige Projekte Routen zum Aufrufen der Geschäftslogik. Deshalb folgen wir auch diesem Prinzip: Öffnen Sie routers/index.js und wir werden den folgenden Inhalt sehen. Die folgende Demo wird diese Datei zur Demonstration verwenden.

3.1. Die Callback-Funktion verarbeitet die asynchrone Express-Logik.

In Express kann das Routing mehrere Middleware laden Schreiben Sie die Geschäftslogik gemäß der Middleware-Schreibmethode. Auf diese Weise kann die asynchrone Logik sehr bequem über die nächsten Schichten aufgeteilt werden.

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.2. Promise-Verarbeitung Express-asynchrone Logik

In dieser Lösung werden mehrere Geschäftslogiken als Rückgabe-Promise-Funktionen gepackt . Führen Sie kombinierte Anrufe über Geschäftsmethoden durch, um den Effekt von „One In“ und „One Out“ zu erzielen.

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.3. async...await handles Express asynchrone Logik

Tatsächlich erfordert diese Lösung auch Promise It wird unterstützt, aber die Schreibmethode ist intuitiver und die Fehlerbehandlung ist direkter.

Es ist zu beachten, dass Express eine frühe Lösung ist und über keine globale Fehlerbehandlung für async...awat verfügt, sodass es durch Paketierung behandelt werden kann.
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;

4. Zusammenfassung


Obwohl Koa für neuere und bessere Verwendung nützlich ist (Koa Es ist ein Generator, der koa2 nativ asynchron unterstützt. Aber als jemand, der angefangen hat, Node 0.x zu verfolgen, habe ich immer noch eine besondere Vorliebe für Express.
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;

Einige der oben genannten Lösungen werden bereits in Koa verwendet und sind in Kombination mit dem riesigen Ökosystem von Express noch leistungsfähiger. Github-Adresse dieses Artikels

Das obige ist der detaillierte Inhalt vonExpress-Entwicklungsgeschichte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn