como funciona o express js?HTTPサーバ「Express like」はゼロ、SEMフレームワークを行う



イントロダクション
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にします.