Leer un archivo en Node.js


186

Estoy bastante perplejo con la lectura de archivos en 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);
    }
});

El archivo start.htmlestá en el mismo directorio con el archivo que intenta abrirlo y leerlo.

Sin embargo, en la consola obtengo:

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

¿Algunas ideas?


8
Lo más probable es que el archivo no esté donde usted / el código cree que está. Si el archivo está en el mismo directorio que el script, intente:path.join(__dirname, 'start.html')
— dc5

1
¿Puede console.log ("__ dirname:" + __dirname); justo antes de la salida err? Eso le dirá qué directorio es local para su ejecutable en ese momento. Hay cosas que puede hacer para cambiar su ubicación y tal vez esté presionando eso, tal vez el código no esté operando en el __dirname donde cree que está.
— Brian

El archivo debe estar en el mismo directorio desde el que ejecuta el proceso de nodo. Entonces, si el archivo está en dir / node / index.html y también lo está su archivo app.js pero usted lo hace: nodo /dir/node/app.js Entonces recibe un error. La solución de dc5 debería hacer el truco.
— Evan Shortiss

Debería cerrar esta pregunta o proporcionar su edición como respuesta y aceptarla.
— ChrisCM

use path.join(__dirname, '/filename.html')y tome referencia de stackoverflow.com/a/56110874/4701635
— Paresh Barad

Respuestas:


237

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

Gracias a dc5.


14
@AramKocharyan Nunca use * Funciones de sincronización en código asíncrono. Esto bloqueará toda la aplicación hasta que se lea el archivo. * Las funciones de sincronización están diseñadas para usarse en el inicio de la aplicación, por ejemplo, en el sistema de módulos.
— Eugene Kostrikov

3
Sí, en mi caso fue una tarea difícil.
— Aram Kocharyan

2
Hay un error tipográfico en su muestra de código, path.joines inútil, use en ,lugar de+
— Yves M.

este código no parece estar funcionando para mí, sigo teniendo el mismo error
— aiden87

¿Por qué no funciona usando solo una ruta simple y fibrosa, como ../someFolder/myFile.txt?
— Miguel Péres

42

Con el Nodo 0.12, es posible hacer esto sincrónicamente ahora:

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

fses el sistema de archivos readFileSync () devuelve un Buffer o cadena si lo solicita.

fsasume correctamente que las rutas relativas son un problema de seguridad. pathEs una solución alternativa.

Para cargar como una cadena, especifique la codificación:

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

55
No use ningún *Syncmétodo cuando programe para la web. Estos solo son apropiados para tareas gruñidoras, aplicaciones de consola, etc. Pausan todo el proceso mientras leen. El código del OP hace referencia, responsepor lo que es claramente una aplicación web donde readFileSyncno es apropiado.
— Samuel Neff

3
Independientemente de si hay otros casos de uso (y la carga de archivos en un caché al inicio definitivamente no es uno de ellos), la publicación del OP definitivamente no es un caso en el que desee usar, readFileSyncestá en el medio del procesamiento una solicitud web Esta respuesta fue totalmente inapropiada para la pregunta en cuestión.
— 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 sincronización:

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

3
en lugar de process.cwd () creo que puedes usar la variable __dirname
— Ishikawa Yoshi

2
@IshikawaYoshi process.cwd()es el directorio de trabajo actual y __dirnamees el directorio del módulo actual, por lo que no son lo mismo.
— A1rPun

13

forma sincrónica simple con nodo:

let fs = require('fs')

let filename = "your-file.something"

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

console.log(content)

9

Ejecute este código, obtendrá datos del archivo y se mostrará en la consola

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 leer el archivo html del servidor usando el httpmódulo. Esta es una forma de leer el archivo del servidor. Si desea obtenerlo en la consola, simplemente elimine la httpdeclaración del 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>


El código anterior es para leer el archivo html en el servidor. Puede leer el archivo html en el servidor, creando un servidor usando el módulo "http". Esta es la forma de responder el archivo en el servidor. También puede eliminar el módulo "http" para obtenerlo en la consola
— Aaditya

1
Hola, es posible que desee incluir su comentario en la respuesta haciendo clic en el botón Editar.
— Glenn Watson

3

Si quieres saber cómo leer un archivo, dentro de un directorio, y hacer algo con él, aquí tienes. Esto también le muestra cómo ejecutar un comando a través de power shell. ¡Esto está adentro TypeScript! Tuve problemas con esto, así que espero que esto ayude a alguien algún día. Siéntete libre de votarme si crees que es tan inútil. Lo que esto hizo por mí fue webpacktodos mis .tsarchivos en cada uno de mis directorios dentro de una carpeta determinada para prepararme para la implementación. ¡Espero que puedas usarlo!

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);
  }
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.