node.js
é baseado no mecanismo v8
do Chrome
para executar código js
, para que possamos nos livrar do ambiente do navegador e executar o código js
diretamente no console, como o seguinte hello world
código hello world
console.log('hello world');
Você pode executá-lo diretamente usando node
no console
O módulo http
integrado do node.js
fornece recursos básicos de serviço http
createServer
Com base na http
CommonJS
, podemos usar require
para importar o módulo http
para uso. módulo que nos permite criar um http
O servidor recebe uma função de retorno de chamada como parâmetro Esta função de retorno de chamada recebe dois parâmetros - request
e response
.
request
inclui todas as informações solicitadas pelo cliente, como url
, header
da solicitação, método de solicitação e. corpo da solicitação.response
é usada principalmente para retornar informações para O cliente encapsula algumas operações relacionadas ao corpo da resposta. Por exemplo, o método response.writeHead
nos permite personalizar as informações do cabeçalho e o código de status do corpo de retorno. o corpo da resposta, chamamos response.end()
. Você pode enviar o corpo da resposta para o cliente. Usar a função createServer
apenas cria um objeto Server
para nós, mas não permite que ele escute. método listen
do objeto server
para escutar. Na verdade, podemos começar a executar
listen
como um servidor. O primeiro parâmetro é o número da porta de escuta, o segundo parâmetro é o ip
do host vinculado e o terceiro parâmetro é uma função de retorno de chamada que será.exceção
http
é obtida do primeiro parâmetro da função de retorno de chamada. Podemos optar por tratar a exceção para tornar nosso servidor mais robusto.usando o módulo http
para criar um servidor simples
const { createServer } = require('http' ); const HOST = 'localhost'; const PORTA = '8080'; const servidor = createServer((req, resp) => { // o primeiro parâmetro é o código de status que ele retorna // e o segundo parâmetro é a informação do cabeçalho de resposta resp.writeHead(200, { 'Tipo de conteúdo': 'texto/simples' }); console.log('servidor está funcionando...'); //chama o método end para informar ao servidor que a solicitação foi atendida resp.end('olá servidor http nodejs'); }); server.listen(PORT, HOST, (erro) => { se (erro) { console.log('Algo errado: ', erro); retornar; } console.log(`o servidor está escutando em http://${HOST}:${PORT} ...`); });
Você pode tentar executá-lo diretamente com node
e criar seu próprio servidor! Depois que o servidor estiver em execução, o navegador poderá acessá-lo acessando http://localhost:8080
Você também pode usar nodemon
para executá-lo, para que, quando nosso código for alterado, não precisemos encerrar manualmente o programa e executar novamente
o npm i -g nodemon.
É recomendável instalá-lo globalmente para que você possa usá-lo diretamente. sem usar npx nodemon
Também é muito simples, basta alterar o comando node
para o comando nodemon
nodemon http-server.js.
. Quando usamos objetos createServer
e resp
anteriormente, não conseguimos ver nenhum prompt de sintaxe. Devemos seguir a documentação oficial node
para verificá-lo a qualquer momento. pode usar .d.ts
nos ajuda a fornecer a função de prompt de sintaxe. Observe que não estamos usando ts
para desenvolvimento, mas apenas usando sua função de prompt de sintaxe
npm init -y
@types/node
-- pnpm i @types/node -D
jsconfig.json
no diretório do projeto, exclua node_modules
, não há necessidade de verificá-lo{ "compilerOptions": { "checkJs": verdadeiro }, "excluir": ["node_modules", "**/node_modules/*"] }
Será que você descobriu que realmente há um erro no código acima? checkJs
pode nos ajudar a verificar erros de tipo. Você pode escolher se deseja ativá-lo de acordo com suas necessidades. Depois de ativar a verificação, ele nos avisará imediatamente sobre incompatibilidade de tipo de parâmetro.
Neste momento, passe o mouse sobre o método listen
e você poderá ver a assinatura do método.
Como você pode ver, o parâmetro port
original precisa ser do tipo number
, mas quando o definimos, era do tipo string
, portanto, não correspondia ao number
8080
e você poderá visualizar diretamente a documentação relevante api
. sem abrir o node
oficial. Demorei muito para encontrar o documento e conferir.
. Nosso http server
simples retornou apenas uma frase, então é possível retornar várias frases? Isso requer o uso do método write
do objeto resp
. end
só pode retornar o end
uma vez. Em vez disso, podemos write
o conteúdo no corpo da resposta várias vezes. passe quaisquer parâmetros. Apenas deixe-o completar a função de enviar o corpo da resposta
const { createServer } = require("http"); const HOST = "localhost"; const PORTA = 8080; const servidor = createServer((req, resp) => { resp.writeHead(200, { "Tipo de conteúdo": "texto/simples" }); console.log("servidor está funcionando..."); // escreve algumas frases lorem resp.write("Lorem ipsum dolor sit amet consectetur adipisicing elit.n"); resp.write("Omnis eligendi aperiam delectus?n"); resp.write("Aut, quam quo!n"); resp.end(); }); server.listen(PORT, HOST, (erro) => { se (erro) { console.log("Algo errado: ", erro); retornar; } console.log(`o servidor está escutando em http://${HOST}:${PORT} ...`); });
Desta vez escrevemos três frases e o efeito agora fica assim.
podemos não apenas retornar uma string ao navegador, mas também ler diretamente o conteúdo do arquivo html
e devolvê-lo ao navegador como resultado. Isso requer o uso de outro módulo integrado Node.js
-. fs
, que O módulo fornece a função de operação de arquivo Você pode usar fs.readFile
para ler arquivos de forma assíncrona, mas ele não retornará um objeto promise
, então precisamos passar um retorno de chamada para lidar com a operação após a leitura do arquivo. também pode usar fs.readFileSync
bloqueando de forma síncrona a leitura de arquivos, aqui escolhemos leitura assíncrona
const { createServer } = require("http"); const fs = requer("fs"); const HOST = "localhost"; const PORT = 8080;const server = createServer((req, resp) => { // altera o tipo MIME de text/plain para text/html resp.writeHead(200, { "Tipo de conteúdo": "texto/html" }); //lê o conteúdo do arquivo html fs.readFile("index.html", (erro, dados) => { se (errar) { console.error( "ocorreu um erro ao ler o conteúdo do arquivo html: ", errar ); lançar errar; } console.log("operação bem sucedida!"); resp.write(dados); resp.end(); }); }); server.listen(PORT, HOST, (erro) => { se (erro) { console.log("Algo errado: ", erro); retornar; } console.log(`o servidor está escutando em http://${HOST}:${PORT} ...`); });
O resultado atual é o seguinte:
Retornar html
com sucesso Nota: Aqui você precisa alterar **Content-Type**
do cabeçalho de resposta para **text/html**
para informar ao navegador que estamos retornando o conteúdo do arquivo **html**
. Se você ainda usar **text/plain**
for retornado, o navegador não analisará o conteúdo retornado, mesmo que esteja em conformidade com a sintaxe **html**
, ele não será analisado, assim como o seguinte:
Quando precisamos escrever um servidor back-end que seja responsável apenas por retornar os dados da interface, precisamos retornar o conteúdo no formato json
. Acredito que você seja inteligente e saiba como lidar com isso:
MIME
para application/json
resp.write
, a string json
é passada. Você pode usar JSON.stringify
para processar o objeto e retornarconst { createServer } = require("http"); const HOST = "localhost"; const PORTA = 8080; const servidor = createServer((req, resp) => { // altera o tipo MIME para application/json resp.writeHead(200, { "Tipo de conteúdo": "aplicativo/json" }); //cria dados JSON usando um objeto const jsonDataObj = { código: 0, mensagem: "sucesso", dados: { nome: "plasticina", idade: 20, hobby: "codificação", }, }; resp.write(JSON.stringify(jsonDataObj)); resp.end(); }); server.listen(PORT, HOST, (erro) => { se (erro) { console.log("Algo errado: ", erro); retornar; } console.log(`o servidor está escutando em http://${HOST}:${PORT} ...`); });
Os resultados são os seguintes:
A ideia de retornar arquivos PDF é semelhante à de retornar arquivos html
antes. Ambos são um processo de configuração do tipo MIME
do cabeçalho de resposta, leitura do arquivo e retorno do conteúdo do arquivo. algo diferente. Nossa ideia é fazer isso enquanto o servidor está rodando. Para gerar um arquivo pdf
e devolvê-lo, você precisa alterar MIME
para application/pdf
Para gerar um arquivo pdf
, você precisa usar uma biblioteca - pdfkit
pnpm i pdfkit.
Primeiro, escrevemos uma função para criar um arquivo pdf
, porque a criação de um arquivo pdf
também requer a realização de algumas operações de escrita, não temos certeza de quando será concluída, mas nossa solicitação deve esperar até que pdf
seja criado antes de podermos. obter uma resposta, então precisamos torná-la assíncrona e retornar uma promise
/** * @description Criar arquivo pdf */const createPdf = () => { retornar nova Promessa((resolver, rejeitar) => { if (!fs.existsSync("exemplo.pdf")) { // cria um objeto PDFDocument const doc = new PDFDocument(); // cria fluxo de gravação canalizando o conteúdo do PDF. doc.pipe(fs.createWriteStream("exemplo.pdf")); //adiciona algum conteúdo ao documento pdf doc.fontSize(16).text("Olá PDF", 100, 100); //conclui a operação de geração do arquivo PDF. doc.end(); } resolver("sucesso"); }); };
A operação de pipeline é usada aqui para transferir o conteúdo PDFDocument
para o fluxo de gravação recém-criado por meio do pipeline. Quando a operação for concluída, notificamos o mundo externo por meio resovle
de que o arquivo pdf
foi criado e, em seguida, chamamos
const. servidor no código do servidor = createServer(async (req, resp) => { // altera o tipo MIME para application/pdf resp.writeHead(200, { "Tipo de conteúdo": "aplicativo/pdf" }); //cria arquivo pdf aguarde createPdf(); //lê o arquivo pdf criado fs.readFile("exemplo.pdf", (erro, dados) => { se (errar) { console.error( "ocorreu um erro ao ler o conteúdo do arquivo pdf: ", errar ); lançar errar; } console.log("operação bem sucedida!"); resp.end(dados); }); }); server.listen(PORT, HOST, (erro) => { se (erro) { console.log("Algo errado: ", erro); retornar; } console.log(`o servidor está escutando em http://${HOST}:${PORT} ...`); });
Agora o navegador pode ler o arquivo pdf
criado
ainda é a mesma. Leia um arquivo de áudio, envie-o para o objeto resp
por meio de um pipeline e retorne-o
. const {stat, createReadStream} = require("fs"); const HOST = "localhost"; const PORTA = 8080; const servidor = createServer((req, resp) => { //muda o tipo MIME para audio/mpe resp.writeHead(200, { "Tipo de conteúdo": "áudio/mp3" }); const mp3NomeArquivo = "áudio.mp3"; stat(mp3NomeArquivo, (err, estatísticas) => { if (stats.isFile()) { const rs = createReadStream(mp3FileName); // canaliza o fluxo de leitura para resp rs.pipe(resp); } outro { resp.end("arquivo mp3 não existe"); } }); }); server.listen(PORT, HOST, (erro) => { se (erro) { console.log("Algo errado: ", erro); retornar; } console.log(`o servidor está escutando em http://${HOST}:${PORT} ...`); });
O efeito é o seguinte
Após a abertura, existe uma interface para reprodução de áudio. Esta é a exibição dos arquivos de áudio fornecidos pelo chrome
. Ao abrir o console, você descobrirá que há arquivos de áudio retornados.
Nota: Depois de passar o fluxo do arquivo de áudio para **resp**
através do pipe , não há necessidade de chamar **resp.end()**
, pois isso fechará a resposta inteira e fará com que o arquivo de áudio seja indisponível.
O processamento de arquivos de vídeo e arquivos de áudio é o mesmo, exceto que MIME
precisa ser alterado para video/mp4
. Todo o resto é o mesmo
const { createServer } = require("http"); const {stat, createReadStream} = require("fs"); const HOST = "localhost"; const PORTA = 8080; const servidor = createServer((req, resp) => { //muda o tipo MIME para audio/mpe resp.writeHead(200, { "Tipo de conteúdo": "áudio/mp4" }); const mp4FileName = "vídeo.mp4"; stat(mp4NomeArquivo, (err, estatísticas) => { if (stats.isFile()) { const rs = createReadStream(mp4FileName); // canaliza o fluxo de leitura para resp rs.pipe(resp); } outro { resp.end("arquivo mp4 não existe"); } }); }); server.listen(PORT, HOST, (erro) => { se (erro) { console.log("Algo errado: ", erro); retornar; } console.log(`o servidor está escutando em http://${HOST}:${PORT} ...`); });
aprendemos:
Node
para criar um servidor http
JSON
pdf
js
html
Embora o conteúdo seja simples, ainda assim, espero que você possa acompanhar e tentar. não significa que você saiba disso. Você só encontrará seus próprios problemas depois de realmente implementá-los.