익스프레스 개발 이력
이 글은 주로 Express의 비동기 진화 역사에 대한 간략한 논의를 소개합니다. 편집자는 그것이 꽤 좋다고 생각하므로 이제 공유하고 참고용으로 제공하겠습니다. 편집기를 따라 살펴보겠습니다
1. 소개
Javascript의 세계에서는 비동기(JavaScript가 단일 스레드에서 실행되므로 JavaScript의 비동기가 차단될 수 있음)는 어디에나 있습니다.
Express는 노드 환경에서 매우 인기 있는 웹 서버 프레임워크입니다. 많은 비율의 Node 웹 애플리케이션이 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에서 제공하는 비동기 프로그래밍 솔루션입니다.
다음 코드는 단순한 데모일 뿐입니다. 실제로 Generator의 사용 과정은 상대적으로 복잡하므로 이 기사에서는 다루지 않습니다.
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를 반환하는 함수로 패키징됩니다. 비즈니스 방식을 통해 통합 통화를 하여 일인, 일 아웃의 효과를 얻으세요.
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 주소
위 내용은 익스프레스 개발 이력의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

Express와 Laravel의 심층 비교: 최고의 프레임워크를 선택하는 방법은 무엇입니까? 프로젝트에 적합한 백엔드 프레임워크를 선택할 때 Express와 Laravel은 의심할 여지 없이 개발자들 사이에서 인기 있는 두 가지 선택입니다. Express는 Node.js 기반의 경량 프레임워크인 반면 Laravel은 PHP 기반의 널리 사용되는 프레임워크입니다. 이 기사에서는 이 두 프레임워크의 장점과 단점을 심층적으로 비교하고 개발자가 자신의 요구 사항에 가장 적합한 프레임워크를 선택하는 데 도움이 되는 특정 코드 예제를 제공합니다. 성능 및 확장성Expr

Express와 Laravel은 각각 JavaScript와 PHP라는 두 가지 주요 개발 언어의 뛰어난 프레임워크를 대표하는 매우 인기 있는 웹 프레임워크입니다. 이 기사에서는 개발자가 자신의 프로젝트 요구 사항에 더 적합한 프레임워크를 선택하는 데 도움이 되도록 이 두 프레임워크를 비교 분석합니다. 1. 프레임워크 소개 Express는 Node.js 플랫폼을 기반으로 하는 웹 애플리케이션 프레임워크로 개발자가 고성능 웹 애플리케이션을 빠르게 구축할 수 있도록 하는 일련의 강력한 기능과 도구를 제공합니다. 표현하다

프로그래밍 언어인 Golang(줄여서 Go 언어)은 최근 몇 년 동안 효율적인 동시 처리 기능과 간결한 구문 기능으로 인해 블록체인 분야에서 점차 등장했습니다. 이 기사에서는 Golang이 블록체인 개발에 어떻게 도움이 되는지 살펴보고 특정 코드 예제를 통해 블록체인 애플리케이션에서의 우수성을 입증할 것입니다. 1. 블록체인 분야에서 Golang의 장점: 효율적인 동시 처리 능력: 블록체인 시스템의 노드는 대량의 트랜잭션과 데이터를 동시에 처리해야 하는데, Gola

제목: C 언어의 기원과 개발 역사 C 언어는 시스템 소프트웨어 및 응용 소프트웨어 개발에 널리 사용되는 고급 프로그래밍 언어입니다. 구조, 모듈성, 이식성의 특징을 가지고 있으며 컴퓨터 분야에서 가장 중요하고 대중적인 프로그래밍 언어 중 하나입니다. 이 기사에서는 C 언어의 기원과 개발 역사를 소개하고 구체적인 코드 예제를 통해 설명합니다. 1. C 언어의 기원 C 언어의 역사는 Bell Labs의 Dennis Ritchie와 Ken Thompson이 개발한 1969년으로 거슬러 올라갑니다.

과학 기술의 급속한 발전과 교육 분야에서 정보 기술의 광범위한 적용으로 인해 세계 최고의 온라인 학습 관리 시스템인 Canvas가 중국 교육 산업에서 점차 떠오르고 있습니다. Canvas의 출현은 중국의 교육 및 교수법 개혁에 대한 새로운 가능성을 제공합니다. 이 기사에서는 중국 교육 부문에서 Canvas의 발전 동향과 전망을 살펴보겠습니다. 우선, 중국 교육 부문에서 Canvas의 발전 추세 중 하나는 심층적 통합입니다. 클라우드 컴퓨팅, 빅 데이터 및 인공 지능의 급속한 발전으로 Canvas는 점점 더 발전할 것입니다.

Go 언어라고도 알려진 Golang은 Google이 개발한 프로그래밍 언어로 동시 프로그래밍 및 네트워크 프로그래밍을 위한 고급 프로그래밍 언어입니다. 최근 몇 년 동안 클라우드 컴퓨팅 기술의 급속한 발전과 함께 클라우드 컴퓨팅 분야에서 Golang의 적용이 점차 주목을 받고 있습니다. 이 기사에서는 Golang이 클라우드 컴퓨팅 개발에 어떻게 도움이 될 수 있는지 살펴보고 특정 코드 예제를 통해 클라우드 컴퓨팅 분야에서 Golang의 장점과 응용 프로그램을 설명합니다. 1. 클라우드 컴퓨팅에서 Golang의 장점 동시 프로그래밍 기능: Golang은 강력한 동시성을 갖추고 탄생했습니다.

ChatGPT부터 AI 드로잉 기술까지, 최근 인공지능 분야의 획기적인 발전의 물결은 Transformer 덕분일 수도 있습니다. 오늘은 유명한 트랜스포머 페이퍼가 제출된 지 6주년이 되는 날입니다. 논문 링크 : https://arxiv.org/abs/1706.03762 6년 전, 사전 인쇄 논문 플랫폼 arXiv에 다소 과장된 이름의 논문이 올라왔습니다. 'xxisAllYouNeed'라는 문구는 AI 분야의 개발자들 사이에서 꾸준히 사용되었습니다. Retelling은 논문 제목에서도 트렌드가 되었으며 Transformer는 더 이상 Transformers를 의미하지 않습니다. 이제 AI 분야에서 가장 진보된 기술을 나타냅니다. 6년 후, 이 논문을 되돌아보며
