var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Logs undefined
, por quê?
javascript
node.js
karaxuna
fonte
fonte
Respostas:
Para elaborar o que o @Raynos disse, a função que você definiu é um retorno de chamada assíncrono. Ele não é executado imediatamente, é executado quando o carregamento do arquivo é concluído. Quando você chama readFile, o controle é retornado imediatamente e a próxima linha de código é executada. Portanto, quando você chama console.log, seu retorno de chamada ainda não foi invocado e esse conteúdo ainda não foi definido. Bem-vindo à programação assíncrona.
Abordagens de exemplo
Ou melhor ainda, como mostra o exemplo do Raynos, envolva sua chamada em uma função e transmita seus próprios retornos de chamada. (Aparentemente, essa é uma prática recomendada). Acho que adquirir o hábito de agrupar suas chamadas assíncronas na função que recebe um retorno de chamada economizará muitos problemas e códigos confusos.
fonte
'utf8'
o nome do arquivo como parâmetro adicional, caso contrário, ele retornará um buffer. Veja: stackoverflow.com/questions/9168737/…Na verdade, existe uma função síncrona para isso:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Assíncrono
fs.readFile(filename, [encoding], [callback])
Lê assincronamente todo o conteúdo de um arquivo. Exemplo:
O retorno de chamada recebe dois argumentos (err, data), em que data é o conteúdo do arquivo.
Se nenhuma codificação for especificada, o buffer bruto será retornado.
SÍNCRONO
fs.readFileSync(filename, [encoding])
Versão síncrona do fs.readFile. Retorna o conteúdo do arquivo chamado filename.
Se a codificação for especificada, essa função retornará uma sequência. Caso contrário, ele retornará um buffer.
fonte
data
.if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
Agora nós convertemos o buffer em texto legível. Isso é bom para ler um arquivo de texto sem formatação ou testar o arquivo em relação aos tipos de formato. Eu poderia tentar / capturar para ver se é um arquivo JSON, por exemplo; mas somente após o buffer ser convertido em texto. Procure aqui para obter mais informações: nodejs.org/api/buffer.htmlAF 42 F1
. Muito prático para comunicação cliente-servidor-cliente.fonte
function readContent(callback)
, écallback
uma palavra reservada? Quero dizer, essa é a maneira padrão de implementar retornos de chamada para suas funções personalizadas? Eu apenas comecei a aprender o nó.event
ouc
qualquer nome que você quiser - não é uma palavra reservada em Javascript, e eu assumiria que o mesmo se estende ao Node.js.readContent(function (err, content)
me dá um erro de sintaxe ao usar a função como parâmetro.Usando promessas com o ES7
Uso assíncrono com mz / fs
O
mz
módulo fornece versões promissificadas da biblioteca de nós principais. Usá-los é simples. Primeiro instale a biblioteca ...Então...
Como alternativa, você pode escrevê-los em funções assíncronas:
fonte
use isso para chamar um arquivo de forma síncrona, sem codificar sua saída de exibição como um buffer.
fonte
Esta linha irá funcionar,
fonte
fs.readFileSync
é o método de sincronização, então não há necessidadeawait
disso. Aguardar é útil com promessas ( nodejs.org/api/fs.html#fs_fs_promises_api ), quando você deseja escrever código assíncrono com sintaxe semelhante ao código de sincronização.fonte
maneira de ler arquivos sincronizados e assíncronos:
Fraude do nó Disponível em read_file .
fonte
Como dito,
fs.readFile
é uma ação assíncrona. Isso significa que, quando você instrui o nó a ler um arquivo, é necessário considerar que levará algum tempo e, enquanto isso, o nó continuará executando o código a seguir. No seu caso, é:console.log(content);
.É como enviar parte do seu código para uma longa viagem (como ler um arquivo grande).
Dê uma olhada nos comentários que escrevi:
É por isso
content
ainda está vazio quando você o registra. O nó ainda não recuperou o conteúdo do arquivo.Isso pode ser resolvido movendo-se para
console.log(content)
dentro da função de retorno de chamada, logo apóscontent = data;
. Dessa forma, você verá o log quando o nó terminar de ler o arquivo e depoiscontent
obtém um valor.fonte
Use a biblioteca promisify incorporada (Nó 8+) para tornar essas funções antigas de retorno de chamada mais elegantes.
fonte
const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');
, sem necessidade de quebra de util.promisify.fonte
Isso ocorre apenas porque o nó é assíncrono e não espera a função de leitura. Assim que o programa for iniciado, o valor do console será definido como indefinido, o que é realmente verdadeiro porque não há valor atribuído à variável de conteúdo. Para lidar, podemos usar promessas, geradores, etc. Podemos usar a promessa dessa maneira.
fonte
O seguinte é função funcionaria para
async
encapsular ou prometerthen
cadeiasfonte
você pode ler o arquivo
Adicionando você pode gravar em um arquivo,
e até encadeá-lo
fonte
Em outras palavras, você está lidando com o node.js, que é de natureza assíncrona.
Quando falamos de assíncrono, estamos falando sobre fazer ou processar informações ou dados enquanto lida com outra coisa. Não é sinônimo de paralelo, lembre-se.
Seu código:
Com sua amostra, ele basicamente faz a parte console.log primeiro, portanto a variável 'conteúdo' é indefinida.
Se você realmente deseja a saída, faça algo assim:
Isso é assíncrono. Vai ser difícil se acostumar, mas é o que é. Novamente, esta é uma explicação grosseira, mas rápida, do que é assíncrono.
fonte