como funciona o express js?HTTPサーバ「Express like」はゼロ、SEMフレームワークを行う
46583 ワード
イントロダクション
Na deste artigo,fiz‐uma‐dddagem com pr e e conso sobre o uso(ou nun‐o uso)フレームワークApesar de ter grandes vantagens , tem um ponnnativo que me cho bastante aten sise o no dia a a dia : muitos desenvolvedores est est o a a imamente dependentes de frameworks , ao pon d n o o conhecer alguns dos basic entos b . sos os tecnologia com a al trabalham .COMO Jは、Chiei先駆的な、EU defendo bastante o「基本をしてください」、ter o conhecimento da base faz com que vocは、tenha uma vis . o o maisアンプe consequentemente、実装者のSlaphes es Melhores para Suas solu Media Henesです.
Hoje eu vou trazerの実装について説明します.Ao longo do caminho vo mostrar algunsは、bem comunsの普遍的なノードjs、como高次の機能、連鎖している機能e出来事を取り除きます.Em Parallelo、Vou Traazerは、Manifacentaを得ます.最終的なDo Artigo、VO deixar oリンクcom todos OSは、exthosをgithubにしません.entはo o、vamos nessa!
Nota: De forma alguma a intenção deste artigo é refazer o express ou criar um framework que substitua o mesmo. Os exemplos são totalmente didáticos, visando o entendimento de alguns conceitos, não tendo a intenção de rodar em produção ou ser um robusto framework de servidor http.
Primeiramente Nは、um nomeの法律、entのoのo forfaa馬faala馬alusの修道院長o o aoの表現、vamos chamar nosso mのdulo de rockspressである.
Express
コンチェクトリーo m
アントニオde iniciarmos o desenvolvimento m mをduloエムsi,vouデモンストレーションcomo criar umはhttpサーバem nodejs(acreditem,muitos desenvolvedores nunca tiveramを必要とする)を簡素化する.FIM DASコンパス、todos osフレームワークは、fafaemの抽象的です.Segueの例
//http.js
const http = require('http');
http.createServer((req, res) => {
res.write('done!');
res.write('\n');
res.end();
}).listen(8000, () => console.log('server listen at 8000'));
Primeiramente Chamamosは、楽しい味見をします、o recreeserver、que retorna um callback com(noforma)は、要求します(que formt m m todasとしてrecebido a cadaレタスSIは、AO Servidor、como URL、体、ヘッダー、etc)e outroパラo応答(que cont e m m toda a estrutura para retornar ao cliente - uma resposta no padr、o、http、comoステータスコード、体、ヘッダ、その他).EM SEGUGAの有用性を楽しんでください.いいえnossoの例示的なEstamos esenvenasは、UMA mensagemのcorpo doの応答e finalizando o mesmo.アゴラ、vamosデfato ao nosso mは、Duloをします.インサイダスO Mは、Duloロックンロール
Primeira Coisa que faremos are criar uma asascle e no m to todo construcutor , riaremos uma posedade que vai radiber nosso server nativo ,前の例について
//rockspress.js
const http = require(‘http’);
class Rockspress {
constructor() {
this.server = http.createServer();
}
}
プロデュースドダドス
エムセガイア、Criaremos Ua EstruturaデDados、que vai ser respon vel por - retraber e armazenar nossasファンエスコイ・インヴェンザル著『ヴァーヴァー』
class Rockspress {
constructor() {
this.server = http.createServer();
this.router = {
GET: {},
POST: {},
PUT: {},
DEL: {}
};
}
}
Criamos um Oojeto Chhamado Router、que Vai Conter Ma所有者パラシュートで降下する人cada mは、todo http que iremos作成者です.Por sua vez,cada uma dasのデッサンの所有者タム・ム・ム・ム・オウムノーザン・ロラス
アゴラque j jは、Temos umas estrutura para armazenar os dados、vamos criar馬楽しみ楽しみoパラシュートで降下してください.VAMOSの利用可能なUMAの高次の機能(パラクェンÑo conhece o termo、esの馬のエナを参照してください.nはo o o vo entrar muito a fundo nos detalhes,pois isso renderia um artigo inteiroいいえNOSSO Casoは、インテの詩は、ファーザーUMAの抽象的である.
registerRoute(method) {
return function (route, callback) {
this.router[method][route] = callback;
}
}
抽象的な部分は、o o oを後退させます、todo HTTP、rota escolhida e qual funを得てください.fazendo oハンドルのDOS要求
アゴラNは、sを要求します.o m ̄dulo HTTP nativo do node , todo baseado em eventos .sempreque que recebemos - uma - nova - rensi - o no no nosso servidor、Eu Emtido um Evento chamado要求.Vamos Criar - uma Fun Specium o que Vai fazer o Gerenciamento desse Evento、Purvedades REQとしてのUtilizando.メソッドe req .URL para acessar nossa estrutura de dados,enviando como argumentos os objetos de request e response
class Rockspress {
constructor() {
//...
this.server.on('request', this.handleRequest.bind(this));
}
async handleRequest(req, res) {
if (!this.router[req.method][req.url]) {
res.statusCode = 404;
res.write('not found');
return res.end();
}
this.router[req.method][req.url](req, res);
}
}
<論説>マウス・ダ・アブストラー・ヴォープ・ヴァイフィール・プ・オー・トー・トー・ロタ・ソルシタダドクスカロネガティオ、SERは、Rtornada Ada Responsta padrが、o o com o statuscode 404(見つからない)です.アゴラque j jは、Estamos fazendo o roteamento dasレニンシバズスレシービタエムテインドドトドス、プレイサモスのオルタナティブOBJetosデ要求e応答、コロッタンドAlbuas抽象的なものは、Eraの上で、Tornar o USO Mais Amigはヴェルです.
オルファントレスポンス
vamosはar ar com oレスポンスに来ます.Criaremos - umaは、あなたの反応を元に戻します.Primeiro , seta o statuscode e o segundo escreve no no response a body um recumido .OS dois retornamはPRのprip応答、permitindo - assim o uso de um padrを得た.
setupResponse(response) {
response.status = (statusCode) => {
response.statusCode = statusCode;
return response;
}
response.send = (responseBody) => {
response.write(responseBody);
response.end();
}
return response;
}
Examo de Chamada COM連鎖関数res.status(200).send('ok');
Nesse Momento、Jは、somos CapazesデRepber Trensi Medichen Ees、Roteque Paras Seus Devidosは、Dre De e Rtornar Ama Responstaに会いました.Make AntesデテスターTudo Funcionando、iRemos Implentar Ma抽象Aは、o o o o objetoを要求します.リクエストリクエスト
レビメントとは何かを意味します.パークス・デス・ストリームとしてのJuntar、Colocando Tudo Em - Ma所有者は、エムformaデjson、para um acesso mais fξci(Simulando Algo semelhante ao que oミドルウェア体パーサーfaz)を要求します.
setupRequest(request) {
request.body = '';
request.on('data', chunk => {
request.body += chunk.toString();
});
return new Promise(resolve => request.on('end', () => {
request.body = request.body ? JSON.parse(request.body) : '';
resolve(request);
}));
}
アッシムque o要求は、partes、fazemos o parse para json e retornamos o要請J .vamos adicionar nossos m setsetup eリクエストのtodosを実行します.ESSEのセットアップタブは、mのpoderia ser feito por eventos、porのm m、escolhiのunzzarはpara facaar o entendimentoを約束する.
async handleRequest(req, res) {
req = await this.setupRequest(req);
res = this.setupResponse(res);
if (!this.router[req.method][req.url]) {
res.statusCode = 404;
res.write('not found');
return res.end();
}
this.router[req.method][req.url](req, res);
}
指数のo Servidorエム
ルネッサンスenenadasとしてのEl - Eucessは、rio tamb m m exporにUMAポルタonde oサーバーvai escutarをします.Prip - isso , FaRemos - umaは抽象化を簡略化します. o do do do do do do do do do do do dulo http , apenas passando pra frente os mesmos argumentos - deebidos :
listen() {
const args = Array.prototype.slice.call(arguments);
return this.server.listen.apply(this.server, args);
}
フェラトンド
パラFinalizar、vamos refatorar o cはdidio、dandoのmais clareza na leitura、criando楽しい美人es es que strastraa a a a a a a a a a a a o o da estrutura de dados eコンフィグレーションTambのm iRemos Exportarは、UMAインストが、NCIAをします.<翻訳>コム・アイソ,ノッソ・M .
//rockspress.js
const http = require('http');
class Rockspress {
constructor() {
this.server = http.createServer();
this.setupRoutes();
this.setupMethods();
this.server.on('request', this.handleRequest.bind(this));
}
setupRoutes() {
this.router = {
GET: {},
POST: {},
PUT: {},
DEL: {}
};
}
setupMethods() {
this.get = this.registerRoute('GET');
this.post = this.registerRoute('POST');
this.put = this.registerRoute('PUT');
this.del = this.registerRoute('DEL');
}
async handleRequest(req, res) {
req = await this.setupRequest(req);
res = this.setupResponse(res);
if (!this.router[req.method][req.url]) {
res.statusCode = 404;
res.write('not found');
return res.end();
}
this.router[req.method][req.url](req, res);
}
setupRequest(request) {
request.body = '';
request.on('data', chunk => {
request.body += chunk.toString();
});
return new Promise(resolve => request.on('end', () => {
request.body = request.body ? JSON.parse(request.body) : '';
resolve(request);
}));
}
setupResponse(response) {
response.status = (statusCode) => {
response.statusCode = statusCode;
return response;
}
response.send = (responseBody) => {
response.write(responseBody);
response.end();
}
return response;
}
registerRoute(method) {
return function (route, callback) {
this.router[method][route] = callback;
}
}
listen() {
const args = Array.prototype.slice.call(arguments);
return this.server.listen.apply(this.server, args);
}
}
module.exports = new Rockspress();
HTTPサーバの実装
EアゴラVamos Criarは、Memmo、com RotasがE柱を得ます
//index.js
const rockspress = require('./rockspress');
rockspress.get('/', (req, res) => {
return res.status(200).send('main');
});
rockspress.get('/ping', (req, res) => {
return res.status(200).send('pong');
});
rockspress.post('/send', (req, res) => {
console.log('request body', req.body);
return res.status(200).send('sent');
});
rockspress.get('/error', (req, res) => {
return res.status(500).send('error');
});
rockspress.listen(8000, () => console.log('listen at 8000'));
ROTAS実装としてのTESTARIO
パラテスター、Vamosの利用者o comando curl(pode se利用者スカーキングクライアントhttp desejado).Primeiro vamos inicializarアプリ:
node index.js
#listen at 8000
ロタゲットcurl http://localhost:8000/ping
#pong
ロッタポストcurl -X POST http://localhost:8000/send -H 'Content-Type: application/json' --data '{"foo":"bar"}'
##request body {"foo":"bar"}
##sent
EパラFinalizar、インプリタニックサスペンスo lado a lado com急行e com nossoロックspress//both.js
/**
* ------------------------------------------------------------------------------
* Server with express framework
*/
const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
return res.status(200).send('main');
});
app.get('/ping', (req, res) => {
return res.status(200).send('pong');
});
app.post('/send', (req, res) => {
console.log('request body', req.body);
return res.status(200).send('sent');
});
app.get('/error', (req, res) => {
return res.status(500).send('error');
});
app.listen(8000, () => console.log('listen at 8000'));
/**
* ------------------------------------------------------------------------------
* Server with custom framework
*/
const rockspress = require('./rockspress');
rockspress.get('/', (req, res) => {
return res.status(200).send('main');
});
rockspress.get('/ping', (req, res) => {
return res.status(200).send('pong');
});
rockspress.post('/send', (req, res) => {
console.log('request body', req.body);
return res.status(200).send('sent');
});
rockspress.get('/error', (req, res) => {
return res.status(500).send('error');
});
rockspress.listen(8001, () => console.log('listen at 8001'));
Segue o Linkは、github com todos os駆除者をします:
https://github.com/thiagomr/rockspress
結論
Eアッシムvamos chegando ao fim.アルムデデレンダリングの言語は、ディオニュソスの巨匠の言語は、詩の詩は、VerのTucealhoo Trabalhosoの実装は、m m ' nnoデFuncionalidades(mメルトqueパラフィンは、円周率は、sem se preocupar com性能、dentre outros aspectosの重要性)de umフレームcomo o expressをしました.EU recomendo que vocは、fesが、Ese TipoデEngenharia Reversaです、pra mim funciona como - uma - de tima fonte de aprendizado e para os novatos pode ser realmente esclarecedor、afinal、quem nunca se perguntou「mas de onde vem esse req、res」?
entはo isso、espero que tenham gostado.私はSigamなしパラFicarem Ligados NOS Proxios Artigos E Compartihem COM OS Amigos Per que Eu possa連続Gerando Conte - Medio .フィードバック、comentは、rios e suestは、sempres sを非難します.
umグランデabraは、oをeにします.
Reference
この問題について(como funciona o express js?HTTPサーバ「Express like」はゼロ、SEMフレームワークを行う), 我々は、より多くの情報をここで見つけました https://dev.to/thiagomr/como-funciona-o-express-js-criando-um-http-server-express-like-do-zero-sem-frameworks-125pテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol