1. Análise de abertura
O módulo do sistema de arquivos é um conjunto simples de operação de E/S de arquivo POSIX simples. O módulo pode ser obtido pela chamada requer ("fs"). Todos os métodos no módulo do sistema de arquivos estão disponíveis em versões assíncronas e síncronas.
(1) O método assíncrono no módulo do sistema de arquivos requer uma função de retorno de chamada preenchida como o último parâmetro formal recebido.
(2) A composição da função de retorno de chamada é determinada pelo método assíncrono chamado. Geralmente, o primeiro parâmetro formal da função de retorno de chamada é a mensagem de erro retornada.
(3) Se a operação assíncrona for executada corretamente e retornar, o parâmetro formal de erro será nulo ou indefinido. Se você estiver usando a versão síncrona do método de operação, uma vez que ocorre um erro, um erro será retornado na forma usual de lançar um erro.
(4) Você pode usar as instruções Tente e captura para interceptar erros e fazer com que o programa continue.
Vamos primeiro olhar para um exemplo simples, leia o arquivo ("bb.txt"):
(1) Crie o arquivo "bb.txt", como segue ("Olá a todos, eu sou Nobita! (*^__^*) hehe ...").
(2), leia a operação do arquivo da seguinte forma:
A cópia do código é a seguinte:
var fs = requer ("fs");
fs.readfile ("bb.txt", "utf8", function (erro, dados) {
se (erro) lançar erro;
console.log (dados);
});
Resultados em execução:
O que você precisa observar aqui é: você deve definir a codificação ao ler arquivos; caso contrário, o formulário padrão aparecerá em "Buffer".
Olhando para o efeito de execução que não está definido, a diferença ainda é muito óbvia. do seguinte modo:
Outra operação de gravação, como segue:
A cópia do código é a seguinte:
var fs = requer ("fs");
var txt = "Todos devem aprender nodejs !!!" ;
// grava no arquivo
fs.writefile ("bb.txt", txt, function (err) {
se (err) lançar err;
console.log ("arquivo salvo!"); // O arquivo é salvo
});
Resultados em execução:
Aqui estão alguns exemplos comuns:
A cópia do código é a seguinte:
// Exclua o arquivo
fs.unlink ('bb.txt', function () {
console.log ('sucesso');
});
// modifica o nome do arquivo
fs.rename ('bb.txt', 'bigbear.txt', function (err) {
console.log ('renomear sucesso');
});
// Verifique o status do arquivo
fs.stat ('bb.txt', function (err, stat) {
console.log (stat);
});
// determinar se o arquivo existe
fs.exists ('bb.txt', função (existe) {
console.log (existe);
});
2. A conexão entre FS e Stream
"Stream" tem recursos assíncronos. Posso dividir um arquivo ou um conteúdo em "pedaços" desconhecidos e lê -lo, e toda vez que um "pedaço" é lido, nós o produzimos. Até que o arquivo seja concluído. É como "codificação de transferência: rolada" suportada por "http1.1". ("CHUNK" pode existir de qualquer forma, o NodeJS existe na forma de "buffer" por padrão, o que é mais eficiente). "Stream" no NodeJS possui um recurso super nos sistemas Unix, que é ("Pipe" ------ Pipeline).
Você ainda se lembra do primeiro programa NodeJS "Hello, Big Bear!"? Fazemos algumas modificações com base no applet, como segue:
(1), crie "bb.html"
A cópia do código é a seguinte:
<html>
<head>
<style type = "text/css">
div {
Margin-top: 50px;
largura: 100%;
margem: 0px;
Altura: 120px;
altura da linha: 120px;
Cor: #ffff;
Size da fonte: 22px;
Antecedentes:#ff9900;
Alinhamento de texto: centro;
}
</style>
</head>
<Body>
<div> Olá, Big Bear! </div>
</body>
</html>
(2), modifique o programa anterior da seguinte forma:
A cópia do código é a seguinte:
var http = requer ('http');
var fs = requer ("fs");
var server = http.createServer (function (req, res) {
fs.readfile ("bb.html", "utf-8", function (err, dados) {
if (err) {
res.WriteHead (500, {'contexto-type': 'text/plana'});
res.nd ('Especifique o arquivo não existe! ou erro do servidor!');
}
outro{
Res.Writehead (200, {'context-type': 'text/html'});
res.write (dados);
res.nd ();
}
})
});
Server.Listen (8888);
console.log ("servidor http em execução na porta 8888 ...");
A seguir, são apresentados os resultados em execução:
Agora precisamos pensar sobre isso, se estamos enviando não um arquivo de texto simples, mas um arquivo hipermediário, como o arquivo de vídeo HD completo da conferência do Google 2014 IO. formato MP4. O comprimento é superior a 2 horas 1080p.
Cerca de 4 GB. Sabe -se que a maneira como "ReadFile" funciona é ler arquivos na memória. Então, obviamente, um arquivo tão grande não pode ser feito. Então, o que devo fazer? Depois disso, você precisa usar o fluxo para fazê -lo. Então é isso.
O código é o seguinte:
A cópia do código é a seguinte:
fs.cretereadstream (__ Dirname + '/vedio.mp4').pipe(res);
Para resumir:
Esses códigos podem implementar as funções necessárias, mas o serviço precisa armazenar em cache todos os dados do arquivo para a memória antes de enviar os dados do arquivo, se o arquivo "bb.html" for muito
Se for grande e tiver uma grande simultaneidade, muita memória será desperdiçada. Como o usuário precisa esperar até que todo o arquivo seja armazenado em cache na memória para aceitar os dados do arquivo, isso leva a
A experiência do usuário é muito ruim. Felizmente, ambos os parâmetros "(req, res)" são fluxo, para que possamos usar o fs.createReadstream () em vez de "fs.readfile ()".
Três, exemplos
Venha fazer upload de um arquivo:
(1) Crie "Server.js"
A cópia do código é a seguinte:
var http = requer ('http');
var url = requer ('url');
Função Iniciar (Route, Handler) {
função onRequest (solicitação, resposta) {
var pathname = url.parse (request.url) .pathname;
// rota para a lógica de negócios correspondente
rota (nome do caminho, manipulador, resposta, solicitação);
}
http.createServer (onRequest) .Listen (3000);
console.log ('servidor está começando');
}
exports.start = start;
(2) Crie "rota.js"
A cópia do código é a seguinte:
Rota da função (Pathname, Handler, Response, Solicitação) {
console.log ('prestes a rotear uma solicitação de' + pathname);
if (typeof Handler [pathname] === 'function') {
manipulador de retorno [nome do caminho] (resposta, solicitação);
} outro {
console.log ('nenhum manipulador de solicitação encontrado para' + pathname);
Response.Writehead (404, {'content-type': 'text/html'});
resposta.write ('404 não encontrado!');
resposta.END ();
}
}
exports.Route = rota;
(3) Crie "requestHandler.js"
A cópia do código é a seguinte:
VAR querystring = requer ('querystring'),
fs = requer ('fs'),
formidável = requer ('formidável');
Função Iniciar (resposta, solicitação) {
console.log ('módulo inicial');
var corpo = '<html>'+
'<head>'+
'<meta http-equiv = "content-type"'+
'Content = "Texto /html; charset = utf-8" />'+
'</head>'+
'<body>'+
'<form action = "/upload" rtype = "multipart/form-data" método = "post">'+
'<input type = "file" name = "upload" múltiplo = "múltiplo">'+
'<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, solicitação) {
console.log ('Módulo de upload');
var form = new formidable.incomingForm ();
form.parse (solicitação, função (erro, campos, arquivos) {
fs.renamesync (files.upload.path, '/tmp/test.png');
Response.writehead (200, {'content-type': 'text/html'});
Response.Write ('Você /' enviou: <r /> ');
Response.Write ('<img src = " /show" />');
resposta.END ();
});
}
Função mostra (resposta, solicitação) {
console.log ('Show Module');
fs.readfile ('/tmp/test.png', 'binário', função (erro, arquivo) {
if (erro) {
Response.writehead (200, {'content-type': 'text/html'});
resposta.write (erro);
resposta.END ();
} outro {
Response.writehead (200, {'content-type': 'image/png'});
resposta.write (arquivo, 'binário');
resposta.END ();
}
});
}
exports.start = start;
exports.upload = upload;
exports.show = show;
(4) Crie "index.js"
A cópia do código é a seguinte:
var server = requer ('./ servidor');
var roteter = requer ('./ roteador');
var requestHandler = requer ('./ requestHandler');
var formidable = requer ('formidável'); // requer algoritmo de pesquisa de caminho? ?
var manipulador = {};
manipulador ['/'] = requestHandler.start;
manipulador ['/start'] = requestHandler.start;
manipulador ['/upload'] = requestHandler.upload;
manipulador ['/show'] = requestHandler.show;
server.start (roteter.route, manipulador);
Quatro, vamos resumir
(1) Entenda a "conexão entre FS e Stream".
(2) Proficiente no uso de APIs relacionadas a "Fs".
(3) Preste atenção aos detalhes, como: os detalhes do processamento entre o método de sincronização da API de operação de arquivo e o método assíncrono.
(4) e, finalmente, enfatize: compreenda o método da organização de código em exemplos de upload de arquivos, constantemente refator e resuma constantemente.