Até agora, o servidor que fizemos não tem uso prático, então começaremos a implementar algumas funções práticas e úteis.
O que precisamos fazer é: o usuário seleciona um arquivo, carrega o arquivo e vê o arquivo carregado no navegador.
Primeiro, precisamos de uma textarea para o usuário inserir o conteúdo e enviá -lo ao servidor por meio de uma solicitação de postagem.
Adicionamos código ao manipulador de eventos iniciais e modificamos o requestHandlers.js da seguinte forma:
A cópia do código é a seguinte:
função start (resposta) {
console.log ("Solicitação Handler 'Start' foi chamado.");
var corpo = '<html>'+ '<head>'+
'<meta http-equiv = "content-type" content = "text/html;'+
'charset = utf-8 " />'+
'</head>'+
'<body>'+
'<form ação = "/upload" método = "post">'+
'<textário name = "text" linhas = "20" cols = "60"> </sexttarea>'+
'<input type = "submite" value = "enviar texto" />'+
'</morm>'+
'</body>'+
'</html>';
Response.writehead (200, {"content-type": "text/html"});
resposta.write (corpo);
resposta.END ();
}
função upload (resposta) {
console.log ("O manipulador de solicitação 'upload' foi chamado.");
Response.writehead (200, {"content-type": "text/plana"});
Response.Write ("Hello upload");
resposta.END ();
}
exports.start = start;
exports.upload = upload;
Você pode ver o efeito visitando http: // localhost: 8888/Iniciar no seu navegador.
Em seguida, queremos implementar o acionamento do manipulador de solicitação /upload para lidar com a solicitação de postagem quando o usuário enviar o formulário.
Para tornar todo o processo que não bloqueia, o Node.js dividirá os dados do post em muitos pequenos blocos de dados e depois passará esses pequenos blocos de dados para a função de retorno de chamada, acionando eventos específicos. Os eventos específicos aqui incluem um evento de dados (indicando que um novo pequeno bloco de dados chegou) e um evento final (indicando que todos os dados foram recebidos).
Fazemos isso registrando um ouvinte no objeto de solicitação. O objeto de solicitação aqui é passado para a função de retorno de chamada OnRequest sempre que uma solicitação HTTP for recebida.
Colocamos o código no servidor e modificamos o server.js da seguinte forma:
A cópia do código é a seguinte:
var http = requer ("http");
var url = requer ("url");
Função Iniciar (Rota, Handle) {
função onRequest (solicitação, resposta) {
var postData = "";
var pathname = url.parse (request.url) .pathname;
console.log ("Solicitação de" + Pathname + "Recebido.");
request.setEncoding ("utf8");
request.addlistener ("dados", função (pós -catachunk) {
PostData += PostDatachunk;
console.log ("Post Data Chunk '" + PostDatachunk + "'.");
});
request.addlistener ("end", function () {
rota (alça, nome do caminho, resposta, pós -dados);
});
}
http.createServer (onRequest) .Listen (8888);
console.log ("O servidor começou");
}
exports.start = start;
O código acima faz três coisas: primeiro, definimos o formato de codificação dos dados recebidos para o UTF-8 e depois registramos o ouvinte para o evento "Data" para coletar novos blocos de dados recebidos a cada vez e atribuí-lo à variável PostData. Por fim, movemos a chamada solicitando a rota para o manipulador de eventos finais para garantir que ela apenas disparasse quando todos os dados forem recebidos e apenas disparam uma vez. Também passamos dados de postagem para solicitar rotas, porque esses dados serão usados pelo manipulador de solicitação.
Em seguida, na página /upload, exiba a entrada do usuário
Vamos mudar o roteador.js:
A cópia do código é a seguinte:
Rota da função (identificador, nome do caminho, resposta, pós -dados) {
console.log ("prestes a rotear uma solicitação de" + pathname);
if (typeof handle [pathname] === 'function') {
Handle [Pathname] (resposta, pós -dados);
} outro {
console.log ("Nenhum manipulador de solicitação encontrado para" + pathname);
Response.WriteHead (404, {"content-type": "text/plana"});
resposta.write ("404 não encontrado");
resposta.END ();
}
}
exports.Route = rota;
Em seguida, no requestHandlers.js, incluímos os dados na resposta à solicitação de upload:
A cópia do código é a seguinte:
Função Iniciar (Resposta, PostData) {
console.log ("Solicitação Handler 'Start' foi chamado.");
var corpo = '<html>'+
'<head>'+
'<meta http-equiv = "content-type" content = "text/html;'+
'charset = utf-8 " />'+
'</head>'+
'<body>'+
'<form ação = "/upload" método = "post">'+
'<textário name = "text" linhas = "20" cols = "60"> </sexttarea>'+
'<input type = "submite" value = "enviar texto" />'+
'</morm>'+
'</body>'+
'</html>';
Response.writehead (200, {"content-type": "text/html"});
resposta.write (corpo);
resposta.END ();
}
Função Upload (resposta, pós -dados) {
console.log ("O manipulador de solicitação 'upload' foi chamado.");
Response.writehead (200, {"content-type": "text/plana"});
Response.Write ("Você enviou:" + PostData);
resposta.END ();
}
exports.start = start;
exports.upload = upload;
A última coisa que precisamos fazer é: atualmente passamos por todo o corpo da mensagem da solicitação para o roteiro de solicitação e manipulador de solicitação. Deveríamos passar apenas os dados do post, a parte em que estamos interessados, para os manipuladores de roteamento e solicitação de solicitação. Em nosso exemplo, o que estamos interessados é o campo de texto.
Podemos usar o módulo de consulta introduzido anteriormente para implementá -lo:
A cópia do código é a seguinte:
VAR querystring = requer ("querystring");
Função Iniciar (Resposta, PostData) {
console.log ("Solicitação Handler 'Start' foi chamado.");
var corpo = '<html>'+
'<head>'+
'<meta http-equiv = "content-type" content = "text/html;'+
'charset = utf-8 " />'+
'</head>'+
'<body>'+
'<form ação = "/upload" método = "post">'+
'<textário name = "text" linhas = "20" cols = "60"> </sexttarea>'+
'<input type = "submite" value = "enviar texto" />'+
'</morm>'+
'</body>'+
'</html>';
Response.writehead (200, {"content-type": "text/html"});
resposta.write (corpo);
resposta.END ();
}
Função Upload (resposta, pós -dados) {
console.log ("O manipulador de solicitação 'upload' foi chamado.");
Response.writehead (200, {"content-type": "text/plana"});
Response.Write ("Você enviou o texto:"+ querystring.parse (pós -dados) .text);
resposta.END ();
}
exports.start = start;
exports.upload = upload;
OK, o acima é tudo sobre o processamento de dados de postagem.
Na próxima seção, implementaremos a função de fazer upload de imagens.