Leia um arquivo no Node.js


186

Estou bastante intrigado com a leitura de arquivos no Node.js.

fs.open('./start.html', 'r', function(err, fileToRead){
    if (!err){
        fs.readFile(fileToRead, {encoding: 'utf-8'}, function(err,data){
            if (!err){
            console.log('received data: ' + data);
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write(data);
            response.end();
            }else{
                console.log(err);
            }
        });
    }else{
        console.log(err);
    }
});

O arquivo start.htmlestá no mesmo diretório do arquivo que tenta abrir e ler.

No entanto, no console, recebo:

{[Erro: ENOENT, abra './start.html'] errno: 34, código: 'ENOENT', caminho: './start.html'}

Alguma ideia?


8
Provavelmente, o arquivo não está onde você / o código pensa. Se o arquivo estiver no mesmo diretório que o script, tente:path.join(__dirname, 'start.html')
dc5

1
Você pode console.log ("__ dirname:" + __dirname); logo antes de você errar? Isso dirá qual diretório é local para o seu executável naquele momento. Há coisas que você pode fazer para alterar sua localização e talvez você esteja acessando isso, talvez o código não esteja operando no __dirname onde você pensa que está.
22713 Brian

O arquivo precisa estar no mesmo diretório em que você executa o processo do nó. Portanto, se o arquivo está em dir / node / index.html e o seu arquivo app.js, mas você faz: node /dir/node/app.js Em seguida, você recebe um erro. A solução do dc5 deve fazer o truque.
precisa saber é o seguinte

Você deve fechar esta pergunta ou fornecer sua edição como resposta e aceitá-la.
ChrisCM

usar path.join(__dirname, '/filename.html')e ter referência de stackoverflow.com/a/56110874/4701635
Paresh Barad

Respostas:


237

Use path.join(__dirname, '/start.html');

var fs = require('fs'),
    path = require('path'),    
    filePath = path.join(__dirname, 'start.html');

fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
    if (!err) {
        console.log('received data: ' + data);
        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write(data);
        response.end();
    } else {
        console.log(err);
    }
});

Graças ao dc5.


14
@AramKocharyan Nunca use as funções * Sync no código assíncrono. Isso bloqueará o aplicativo inteiro até que o arquivo seja lido. * As funções de sincronização foram projetadas para serem usadas na inicialização do aplicativo, por exemplo, no sistema de módulos.
Eugene Kostrikov

3
Sim, no meu caso, foi uma tarefa difícil.
Aram Kocharyan

2
Há um erro de digitação no seu exemplo de código, o seu path.joiné inútil, use em ,vez de+
Yves M.

este código não parece estar a trabalhar para mim, eu ainda obter o mesmo erro
aiden87

Por que ele não funciona usando apenas um caminho simples e complexo ../someFolder/myFile.txt?
Miguel Péres

42

Com o Nó 0.12, é possível fazer isso de forma síncrona agora:

  var fs = require('fs');
  var path = require('path');

  // Buffer mydata
  var BUFFER = bufferFile('../public/mydata.png');

  function bufferFile(relPath) {
    return fs.readFileSync(path.join(__dirname, relPath)); // zzzz....
  }

fsé o sistema de arquivos. readFileSync () retorna um buffer ou string, se você perguntar.

fsassume corretamente que os caminhos relativos são um problema de segurança. pathé uma solução alternativa.

Para carregar como uma sequência, especifique a codificação:

return fs.readFileSync(path,{ encoding: 'utf8' });

5
Não use nenhum *Syncmétodo ao programar para a web. Eles são apropriados apenas para tarefas grunt / gulp, aplicativos de console etc. Eles pausam todo o processo durante a leitura. O código do OP faz referência, responseportanto, é claramente um aplicativo da Web onde readFileSyncnão é apropriado.
Samuel Neff 06/06

3
Independentemente de haver ou não outros casos de uso (e o carregamento de arquivos em um cache na inicialização definitivamente não é um deles), a postagem do OP definitivamente não é o caso em que você deseja usar - ele readFileSyncestá no meio do processamento uma solicitação da web. Esta resposta foi totalmente inadequada para a pergunta em questão.
Samuel Neff

28

1) .Para ASync:

var fs = require('fs');
fs.readFile(process.cwd()+"\\text.txt", function(err,data)
            {
                if(err)
                    console.log(err)
                else
                    console.log(data.toString());
            });

2) .Para sincronização:

var fs = require('fs');
var path = process.cwd();
var buffer = fs.readFileSync(path + "\\text.txt");
console.log(buffer.toString());

3
em vez de process.cwd () eu acho que você pode usar __dirname variável
Ishikawa Yoshi

2
@IshikawaYoshi process.cwd()é o diretório de trabalho atual e __dirnameé o diretório do módulo atual, portanto eles não são os mesmos.
A1rPun

13

maneira síncrona simples com o nó:

let fs = require('fs')

let filename = "your-file.something"

let content = fs.readFileSync(process.cwd() + "/" + filename).toString()

console.log(content)

9

Execute este código, ele buscará dados do arquivo e será exibido no console

function fileread(filename)
{            
   var contents= fs.readFileSync(filename);
   return contents;
}        
var fs =require("fs");  // file system        
var data= fileread("abc.txt");
//module.exports.say =say;
//data.say();
console.log(data.toString());

5

Para ler o arquivo html do servidor usando o httpmódulo Esta é uma maneira de ler o arquivo do servidor. Se você deseja obtê-lo no console, remova a httpdeclaração do módulo.

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req, res) {
  fs.readFile('HTMLPage1.html', function(err, data) {
    if (!err) {
      res.writeHead(200, {
        'Content-Type': 'text/html'
      });
      res.write(data);
      res.end();
    } else {
      console.log('error');
    }
  });
});
server.listen(8000, function(req, res) {
  console.log('server listening to localhost 8000');
});
<html>

<body>
  <h1>My Header</h1>
  <p>My paragraph.</p>
</body>

</html>


O código acima é para ler o arquivo html no servidor. Você pode ler o arquivo html no servidor, criando um servidor usando o módulo "http". Este é o caminho para o arquivo de resposta no servidor. Você também pode remover "http" módulo para obtê-lo no console
Aaditya

1
Olá, convém incluir seu comentário na resposta clicando no botão editar.
Glenn Watson

3

Se você quiser saber como ler um arquivo, dentro de um diretório, e fazer algo com ele, aqui está. Isso também mostra como executar um comando através do power shell. Isto está dentro TypeScript! Eu tive problemas com isso, então espero que isso ajude alguém um dia. Sinta-se livre para votar-me se você acha que é inútil. O que isso fez por mim foi webpacktodos os meus .tsarquivos em cada um dos meus diretórios dentro de uma determinada pasta para se preparar para a implantação. Espero que você possa usá-lo!

import * as fs from 'fs';
let path = require('path');
let pathDir = '/path/to/myFolder';
const execSync = require('child_process').execSync;

let readInsideSrc = (error: any, files: any, fromPath: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach((file: any, index: any) => {
        if (file.endsWith('.ts')) {
            //set the path and read the webpack.config.js file as text, replace path
            let config = fs.readFileSync('myFile.js', 'utf8');
            let fileName = file.replace('.ts', '');
            let replacedConfig = config.replace(/__placeholder/g, fileName);

            //write the changes to the file
            fs.writeFileSync('myFile.js', replacedConfig);

            //run the commands wanted
            const output = execSync('npm run scriptName', { encoding: 'utf-8' });
            console.log('OUTPUT:\n', output);

            //rewrite the original file back
            fs.writeFileSync('myFile.js', config);
        }
    });
};

// loop through all files in 'path'
let passToTest = (error: any, files: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach(function (file: any, index: any) {
        let fromPath = path.join(pathDir, file);
        fs.stat(fromPath, function (error2: any, stat: any) {
            if (error2) {
                console.error('Error stating file.', error2);
                return;
            }

            if (stat.isDirectory()) {
                fs.readdir(fromPath, (error3: any, files1: any) => {
                    readInsideSrc(error3, files1, fromPath);
                });
            } else if (stat.isFile()) {
                //do nothing yet
            }

        });
    });
};

//run the bootstrap
fs.readdir(pathDir, passToTest);

2
var fs = require('fs');
var path = require('path');

exports.testDir = path.dirname(__filename);
exports.fixturesDir = path.join(exports.testDir, 'fixtures');
exports.libDir = path.join(exports.testDir, '../lib');
exports.tmpDir = path.join(exports.testDir, 'tmp');
exports.PORT = +process.env.NODE_COMMON_PORT || 12346;

// Read File
fs.readFile(exports.tmpDir+'/start.html', 'utf-8', function(err, content) {
  if (err) {
    got_error = true;
  } else {
    console.log('cat returned some content: ' + content);
    console.log('this shouldn\'t happen as the file doesn\'t exist...');
    //assert.equal(true, false);
  }
});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.