Leggi un file in Node.js


186

Sono abbastanza perplesso con la lettura di file in 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);
    }
});

Il file si start.htmltrova nella stessa directory con il file che tenta di aprirlo e leggerlo.

Tuttavia, nella console ottengo:

{[Errore: ENOENT, apri './start.html'] errno: 34, codice: 'ENOENT', percorso: './start.html'}

Qualche idea?


8
È probabile che il file non sia dove pensi che sia. Se il file si trova nella stessa directory dello script, provare:path.join(__dirname, 'start.html')
dc5

1
Puoi console.log ("__ dirname:" + __dirname); appena prima di aver prodotto err? Questo dirà quale directory è locale per il tuo eseguibile in quel momento. Ci sono cose che puoi fare per cambiare la tua posizione e forse stai colpendo quello, forse il codice non funziona al __dirname dove pensi che sia.
Brian,

Il file deve trovarsi nella stessa directory da cui si esegue il processo del nodo. Quindi, se il file è in dir / node / index.html e lo è anche il tuo file app.js ma lo fai: node /dir/node/app.js Quindi ricevi un errore. La soluzione di DC5 dovrebbe fare il trucco.
Evan Shortiss,

Dovresti chiudere questa domanda o fornire la modifica come risposta e accettarla.
ChrisCM,

utilizzare path.join(__dirname, '/filename.html')e prendere riferimento da stackoverflow.com/a/56110874/4701635
Paresh Barad

Risposte:


237

Utilizzare 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);
    }
});

Grazie a DC5.


14
@AramKocharyan Non usare mai le funzioni * Sync nel codice asincrono. Ciò bloccherà l'intera app fino alla lettura del file. * Le funzioni di sincronizzazione sono progettate per essere utilizzate all'avvio dell'app, ad es. Nel sistema di moduli.
Eugene Kostrikov,

3
Sì, nel mio caso è stato un compito duro.
Aram Kocharyan,

2
C'è un errore di battitura nell'esempio di codice, il tuo path.joinè inutile, usa ,invece di+
Yves M.

questo codice non sembra funzionare per me, ho ancora lo stesso errore
aiden87

Perché non funziona usando solo un semplice percorso filante, come ../someFolder/myFile.txt?
Miguel Péres,

42

Con Nodo 0.12, è possibile farlo ora in modo sincrono:

  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è il file system. readFileSync () restituisce un buffer o una stringa se lo chiedi.

fspresuppone correttamente che i percorsi relativi siano un problema di sicurezza. pathè una soluzione.

Per caricare come stringa, specificare la codifica:

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

5
Non utilizzare alcun *Syncmetodo durante la programmazione per il Web. Questi sono appropriati solo per attività grunt / gulp, app per console, ecc. Mettono in pausa l'intero processo durante la lettura. Il codice OP fa riferimento responsequindi è chiaramente un'app Web in cui readFileSyncnon è appropriato.
Samuel Neff,

3
Indipendentemente dal fatto che ci siano altri casi d'uso (e il caricamento di file in una cache all'avvio non è sicuramente uno di questi), il post dell'OP non è sicuramente un caso in cui si desidera utilizzare readFileSync: è nel mezzo dell'elaborazione una richiesta web. Questa risposta era totalmente inappropriata rispetto alla domanda in corso.
Samuel Neff,

28

1). Per 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) .Per la sincronizzazione:

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

3
invece di process.cwd () penso che tu possa usare la variabile __dirname
Ishikawa Yoshi

2
@IshikawaYoshi process.cwd()è la directory di lavoro corrente ed __dirnameè la directory del modulo corrente, quindi non sono uguali.
A1rPun

13

modo sincrono semplice con nodo:

let fs = require('fs')

let filename = "your-file.something"

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

console.log(content)

9

Esegui questo codice, recupererà i dati dal file e li visualizzerà nella 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

Per leggere il file html dal server utilizzando il httpmodulo. Questo è un modo per leggere il file dal server. Se vuoi scaricarlo sulla console, rimuovi la httpdichiarazione del modulo.

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>


Il codice sopra è leggere il file html sul server. Puoi leggere il file html sul server, creando il server usando il modulo "http". Questo è il modo di file di risposta sul server. Puoi anche rimuovere il modulo "http" per ottenerlo sulla console
Aaditya,

1
Ehi, potresti includere il tuo commento nella risposta facendo clic sul pulsante Modifica.
Glenn Watson,

3

Se vuoi sapere come leggere un file, all'interno di una directory, e fare qualcosa con esso, ecco qui. Questo mostra anche come eseguire un comando attraverso power shell. Questo è dentro TypeScript! Ho avuto problemi con questo, quindi spero che questo possa aiutare qualcuno un giorno. Sentiti libero di votarmi se pensi che sia così inutile. Ciò che ha fatto per me sono stati webpacktutti i miei .tsfile in ciascuna delle mie directory all'interno di una determinata cartella per essere pronti per la distribuzione. Spero che tu possa metterlo in uso!

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);
  }
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.