Lesen Sie eine Datei in Node.js.


186

Ich bin ziemlich verwirrt über das Lesen von Dateien 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);
    }
});

Die Datei start.htmlbefindet sich im selben Verzeichnis wie die Datei, die versucht, sie zu öffnen und zu lesen.

In der Konsole bekomme ich jedoch:

{[Fehler: ENOENT, öffne './start.html'] errno: 34, Code: 'ENOENT', Pfad: './start.html'}

Irgendwelche Ideen?


8
Möglicherweise befindet sich die Datei nicht dort, wo Sie / der Code sie für richtig hält. Wenn sich die Datei im selben Verzeichnis wie das Skript befindet, versuchen Sie:path.join(__dirname, 'start.html')
dc5

1
Können Sie console.log ("__ dirname:" + __dirname); kurz bevor Sie err ausgeben? Dadurch wird festgestellt, welches Verzeichnis gerade für Ihre ausführbare Datei lokal ist. Es gibt Dinge, die Sie tun können, um Ihren Standort zu ändern, und vielleicht treffen Sie das, vielleicht funktioniert der Code nicht unter dem __dirname, von dem Sie glauben, dass er ist.
Brian

Die Datei muss sich in demselben Verzeichnis befinden, in dem Sie den Knotenprozess ausführen. Wenn sich die Datei in dir / node / index.html befindet und Ihre app.js-Datei, aber Sie dies tun: node /dir/node/app.js Dann erhalten Sie eine Fehlermeldung. Die Lösung von dc5 sollte den Trick machen.
Evan Shortiss

Sie sollten diese Frage schließen oder Ihre Bearbeitung als Antwort angeben und akzeptieren.
ChrisCM

Verwenden Sie path.join(__dirname, '/filename.html')und nehmen Sie Referenz von stackoverflow.com/a/56110874/4701635
Paresh Barad

Antworten:


236

Verwenden Sie 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);
    }
});

Danke an dc5.


14
@AramKocharyan Verwenden Sie niemals * Sync-Funktionen im asynchronen Code. Dadurch wird die gesamte App gesperrt, bis die Datei gelesen wird. * Synchronisierungsfunktionen sind für den Start der App vorgesehen, z. B. im Modulsystem.
Eugene Kostrikov

3
Ja, in meinem Fall war es eine Grunzaufgabe.
Aram Kocharyan

2
Es gibt einen Tippfehler in Ihrem Codebeispiel, Ihr path.joinist nutzlos, verwenden Sie ,anstelle von+
Yves M.

Dieser Code scheint nicht für mich zu funktionieren, ich bekomme immer noch den gleichen Fehler
aiden87

Warum funktioniert es nicht nur mit einem einfachen, fadenförmigen Pfad ../someFolder/myFile.txt?
Miguel Péres

42

Mit Node 0.12 ist dies jetzt synchron möglich:

  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....
  }

fsist das Dateisystem. readFileSync () gibt einen Puffer oder eine Zeichenfolge zurück, wenn Sie danach fragen.

fsgeht korrekt davon aus, dass relative Pfade ein Sicherheitsproblem darstellen. pathist eine Umgehung.

Geben Sie zum Laden als Zeichenfolge die Codierung an:

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

5
Verwenden Sie *Syncbeim Programmieren für das Web keine Methoden. Diese sind nur für Grunz- / Schluckaufgaben, Konsolen-Apps usw. geeignet. Sie unterbrechen den gesamten Vorgang beim Lesen. Der Code des OP verweist responseauf eine Web-App, bei der dies readFileSyncnicht angemessen ist.
Samuel Neff

3
Unabhängig davon, ob es andere Anwendungsfälle gibt oder nicht (und das Laden von Dateien in einen Cache beim Start gehört definitiv nicht dazu), ist der Beitrag des OP definitiv kein Fall, in dem Sie ihn verwenden möchten - er readFileSyncbefindet sich mitten in der Verarbeitung eine Webanfrage. Diese Antwort war für die vorliegende Frage völlig unangemessen.
Samuel Neff

28

1) .Für 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) .Für die Synchronisierung:

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

3
anstelle von process.cwd () denke ich, dass Sie __dirname Variable
Ishikawa Yoshi

2
@IshikawaYoshi process.cwd()ist das aktuelle Arbeitsverzeichnis und __dirnamedas Verzeichnis des aktuellen Moduls, sodass sie nicht identisch sind.
A1rPun

13

einfache synchrone Weise mit Knoten:

let fs = require('fs')

let filename = "your-file.something"

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

console.log(content)

9

Wenn Sie diesen Code ausführen, werden Daten aus der Datei abgerufen und in der Konsole angezeigt

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

Lesen der HTML-Datei vom Server mithilfe des httpModuls. Dies ist eine Möglichkeit, Dateien vom Server zu lesen. Wenn Sie es auf die Konsole bringen möchten, entfernen Sie einfach die httpModuldeklaration.

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>


Der obige Code dient zum Lesen der HTML-Datei auf dem Server. Sie können die HTML-Datei auf dem Server lesen, indem Sie den Server mit dem Modul "http" erstellen. Dies ist der Weg zur Antwortdatei auf dem Server. Sie können auch das "http" -Modul entfernen, um es auf die Konsole zu bringen
Aaditya

1
Hallo, vielleicht möchten Sie Ihren Kommentar in die Antwort aufnehmen, indem Sie auf die Schaltfläche Bearbeiten klicken.
Glenn Watson

3

Wenn Sie wissen möchten, wie man eine Datei in einem Verzeichnis liest und etwas damit macht, können Sie loslegen. Dies zeigt Ihnen auch, wie Sie einen Befehl über das ausführen power shell. Das ist in TypeScript! Ich hatte Probleme damit, also hoffe ich, dass dies eines Tages jemandem hilft. Fühlen Sie sich frei, mich abzustimmen, wenn Sie denken, dass es nicht hilfreich ist. Für mich waren dies webpackalle meine .tsDateien in jedem meiner Verzeichnisse in einem bestimmten Ordner, um die Bereitstellung vorzubereiten. Hoffe du kannst es nutzen!

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);
  }
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.