Lire un fichier dans Node.js


187

Je suis assez perplexe avec la lecture de fichiers dans 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);
    }
});

Le fichier start.htmlest dans le même répertoire que le fichier qui tente de l'ouvrir et de le lire.

Cependant, dans la console, j'obtiens:

{[Erreur: ENOENT, ouvrez './start.html'] errno: 34, code: 'ENOENT', chemin: './start.html'}

Des idées?


8
Il y a de fortes chances que le fichier ne soit pas là où vous / le code le pensez. Si le fichier se trouve dans le même répertoire que le script, essayez:path.join(__dirname, 'start.html')
— dc5

1
Pouvez-vous console.log ("__ dirname:" + __dirname); juste avant de sortir une erreur? Cela dira quel répertoire est local pour votre exécutable à ce moment. Il y a des choses que vous pouvez faire pour changer votre emplacement et peut-être que vous le faites, peut-être que le code ne fonctionne pas sur le __dirname où vous pensez qu'il se trouve.
— Brian

Le fichier doit se trouver dans le même répertoire à partir duquel vous exécutez le processus de nœud. Donc, si le fichier est dans dir / node / index.html, tout comme votre fichier app.js, mais que vous faites: node /dir/node/app.js Ensuite, vous recevez une erreur. La solution de dc5 devrait faire l'affaire.
— Evan Shortiss

Vous devez fermer cette question ou fournir votre modification comme réponse et l'accepter.
— ChrisCM

utilisez path.join(__dirname, '/filename.html')et prenez la référence de stackoverflow.com/a/56110874/4701635
— Paresh Barad

Réponses:


238

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

Merci à dc5.


14
@AramKocharyan N'utilisez jamais les fonctions * Sync dans le code asynchrone. Cela verrouille toute l'application jusqu'à ce que le fichier soit lu. * Les fonctions de synchronisation sont conçues pour être utilisées au démarrage de l'application, par exemple dans le système de modules.
— Eugene Kostrikov

3
Ouais, dans mon cas, c'était une tâche difficile.
— Aram Kocharyan

2
Il y a une erreur de frappe dans votre exemple de code, votre path.joinest inutile, utilisez à la ,place de+
— Yves M.

ce code ne semble pas fonctionner pour moi, j'obtiens toujours la même erreur
— aiden87

Pourquoi cela ne fonctionne pas en utilisant simplement un chemin filandreux, comme ../someFolder/myFile.txt?
— Miguel Péres

42

Avec Node 0.12, il est maintenant possible de le faire de manière synchrone:

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

fsest le système de fichiers. readFileSync () renvoie un Buffer, ou une chaîne si vous le demandez.

fs suppose correctement que les chemins relatifs sont un problème de sécurité. pathest une solution de rechange.

Pour charger sous forme de chaîne, spécifiez l'encodage:

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

5
N'utilisez aucune *Syncméthode lors de la programmation pour le Web. Celles-ci ne sont appropriées que pour les tâches grunt / gulp, les applications de console, etc. Elles interrompent tout le processus pendant la lecture. Le code de l'OP fait référence à responseune application Web qui readFileSyncn'est donc pas appropriée.
— Samuel Neff

3
Qu'il y ait ou non d'autres cas d'utilisation (et le chargement de fichiers dans un cache au démarrage n'en fait certainement pas partie), la publication de l'OP n'est certainement pas un cas où vous souhaitez utiliser readFileSync- il est en cours de traitement une requête Web. Cette réponse était totalement inappropriée à la question posée.
— Samuel Neff

28

1) .Pour 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) .Pour la synchronisation:

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

3
au lieu de process.cwd (), je pense que vous pouvez utiliser la variable __dirname
— Ishikawa Yoshi

2
@IshikawaYoshi process.cwd()est le répertoire de travail courant et __dirnameest le répertoire du module courant donc ils ne sont pas les mêmes.
— A1rPun

13

manière synchrone simple avec le nœud:

let fs = require('fs')

let filename = "your-file.something"

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

console.log(content)

9

Exécutez ce code, il récupérera les données du fichier et les affichera dans la 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

Pour lire le fichier html du serveur à l'aide du httpmodule. C'est une façon de lire un fichier à partir du serveur. Si vous voulez l'obtenir sur la console, supprimez simplement la httpdéclaration du module.

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>


Le code ci-dessus est de lire le fichier html sur le serveur. Vous pouvez lire le fichier html sur le serveur, en créant le serveur à l'aide du module "http". C'est le moyen de fichier de réponse sur le serveur. Vous pouvez également supprimer le module "http" pour l'obtenir sur la console
— Aaditya

1
Salut, vous voudrez peut-être inclure votre commentaire dans la réponse en cliquant sur le bouton Modifier.
— Glenn Watson

3

Si vous voulez savoir comment lire un fichier, dans un répertoire, et en faire quelque chose, c'est parti. Cela vous montre également comment exécuter une commande via le power shell. C'est dans TypeScript! J'ai eu des problèmes avec cela, alors j'espère que cela aidera quelqu'un un jour. N'hésitez pas à voter pour moi si vous pensez que ce n'est pas utile. Ce que cela a fait pour moi, c'est webpacktous mes .tsfichiers dans chacun de mes répertoires dans un certain dossier pour se préparer au déploiement. J'espère que vous pourrez l'utiliser!

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);
  }
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.