Przeczytaj plik w Node.js


186

Jestem dość zaintrygowany czytaniem plików w 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);
    }
});

Plik start.htmlznajduje się w tym samym katalogu z plikiem, który próbuje go otworzyć i odczytać.

Jednak w konsoli otrzymuję:

{[Błąd: ENOENT, otwórz „./start.html”] errno: 34, kod: „ENOENT”, ścieżka: „./start.html”}

Jakieś pomysły?


8
Możliwe, że plik nie jest tam, gdzie myślisz / kod. Jeśli plik znajduje się w tym samym katalogu co skrypt, spróbuj:path.join(__dirname, 'start.html')
dc5

1
Czy możesz console.log („__ nazwa_katalogu:” + __ nazwa_katalogu); tuż przed wyjściem err? To powie, który katalog jest lokalny dla twojego pliku wykonywalnego w tym momencie. Są rzeczy, które możesz zrobić, aby zmienić swoją lokalizację, a może to się dzieje, być może kod nie działa w nazwie __dirname, gdzie Twoim zdaniem jest.
Brian

Plik musi znajdować się w tym samym katalogu, z którego uruchamiany jest proces węzła. Więc jeśli plik znajduje się w katalogu dir / node / index.html, podobnie jak plik app.js, ale robisz: node /dir/node/app.js. Wtedy pojawia się błąd. Rozwiązanie dc5 powinno załatwić sprawę.
Evan Shortiss,

Powinieneś zamknąć to pytanie lub podać swoją odpowiedź jako odpowiedź i zaakceptować ją.
ChrisCM,

użyj path.join(__dirname, '/filename.html')i
Paresh Barad

Odpowiedzi:


237

Użyj 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);
    }
});

Dzięki dc5.


14
@AramKocharyan Nigdy nie używaj * funkcji synchronizacji w kodzie asynchronicznym. Spowoduje to zablokowanie całej aplikacji, dopóki plik nie zostanie odczytany. * Funkcje synchronizacji są przeznaczone do użycia przy uruchamianiu aplikacji, np. W systemie modułów.
Eugene Kostrikov

3
Tak, w moim przypadku było to cholerne zadanie.
Aram Kocharyan

2
Wystąpił błąd literowy w przykładowym kodzie, twój path.joinjest bezużyteczny, użyj ,zamiast+
Yves M.

ten kod wydaje się nie działać dla mnie, nadal
pojawia

Dlaczego to nie działa przy użyciu prostej, sztywnej ścieżki, na przykład ../someFolder/myFile.txt?
Miguel Péres

42

W przypadku Węzła 0.12 można to teraz zrobić synchronicznie:

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

fsto system plików. readFileSync () zwraca Bufor lub ciąg znaków, jeśli o to poprosisz.

fspoprawnie zakłada, że ​​ścieżki względne stanowią problem bezpieczeństwa. pathjest obejście.

Aby załadować jako ciąg, określ kodowanie:

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

5
Nie używaj żadnych *Syncmetod podczas programowania dla Internetu. Są one odpowiednie tylko dla zadań chrząkania / przełykania, aplikacji konsolowych itp. Zatrzymują cały proces podczas czytania. Odwołania do kodu OP, responsewięc jest to oczywiście aplikacja internetowa, w której readFileSyncnie jest odpowiednia.
Samuel Neff,

3
Niezależnie od tego, czy istnieją inne przypadki użycia (i ładowanie plików do pamięci podręcznej podczas uruchamiania zdecydowanie nie jest jednym z nich), post OP nie jest zdecydowanie przypadkiem, w którym chcesz użyć readFileSync- jest w trakcie przetwarzania żądanie sieciowe. Ta odpowiedź była całkowicie nieodpowiednia do pytania.
Samuel Neff,

28

1) .Dla 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). Do synchronizacji:

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

3
zamiast process.cwd () myślę, że można użyć zmiennej __dirname
Ishikawa Yoshi,

2
@IshikawaYoshi process.cwd()jest bieżącym katalogiem roboczym i __dirnamejest katalogiem bieżącego modułu, więc nie są takie same.
A1rPun

13

prosty sposób synchroniczny z węzłem:

let fs = require('fs')

let filename = "your-file.something"

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

console.log(content)

9

Uruchom ten kod, pobierze dane z pliku i wyświetli w konsoli

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

Aby odczytać plik HTML z serwera za pomocą httpmodułu. Jest to jeden ze sposobów odczytu pliku z serwera. Jeśli chcesz go pobrać na konsolę, po prostu usuń httpdeklarację modułu.

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>


Powyższy kod służy do odczytu pliku HTML na serwerze. Plik HTML można odczytać na serwerze, tworząc serwer za pomocą modułu „http”. Jest to sposób na plik odpowiedzi na serwerze. Możesz także usunąć moduł „http”, aby uzyskać go na konsolę
Aaditya

1
Cześć, możesz dodać swój komentarz do odpowiedzi, klikając przycisk edycji.
Glenn Watson,

3

Jeśli chcesz wiedzieć, jak odczytać plik w katalogu i coś z nim zrobić, proszę bardzo. To pokazuje również, jak uruchomić polecenie za pośrednictwem power shell. To jest w TypeScript! Miałem z tym problem, więc mam nadzieję, że to komuś pomoże. Nie wahaj się głosować, jeśli uważasz, że to NIE jest pomocne. To, co zrobiłem dla mnie, to webpackwszystkie moje .tspliki w każdym z katalogów w określonym folderze, aby przygotować się do wdrożenia. Mam nadzieję, że możesz go użyć!

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);
  }
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.