Прочитать файл в Node.js


187

Я довольно озадачен чтением файлов в 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);
    }
});

Файл start.htmlнаходится в одном каталоге с файлом, который пытается открыть и прочитать его.

Тем не менее, в консоли я получаю:

{[Ошибка: ENOENT, открыть «./start.html»] номер ошибки: 34, код: «ENOENT», путь: «./start.html»}

Любые идеи?


8
Скорее всего, файл находится не там, где вы / код думаете. Если файл находится в том же каталоге, что и скрипт, попробуйте:path.join(__dirname, 'start.html')
dc5

1
Можете ли вы console.log ("__dirname:" + __dirname); прямо перед выводом err? Это скажет, какой каталог является локальным для вашего исполняемого файла в данный момент. Есть вещи, которые вы можете сделать, чтобы изменить свое местоположение, и, возможно, вы нажали на это, возможно, код не работает с тем именем, которое, по вашему мнению, находится на __dirname.
Брайан

Файл должен находиться в том же каталоге, из которого вы запускаете процесс узла. Так что, если файл находится в dir / node / index.html, как и ваш файл app.js, но вы делаете это: node /dir/node/app.js Тогда вы получите ошибку. Решение DC5 должно сделать свое дело.
Эван Шортисс,

Вам следует закрыть этот вопрос или предоставить свое изменение в качестве ответа и принять его.
ChrisCM

используйте path.join(__dirname, '/filename.html')и берите ссылку на stackoverflow.com/a/56110874/4701635
Пареш Барад

Ответы:


238

Использование 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);
    }
});

Спасибо dc5.


14
@AramKocharyan Никогда не используйте * функции синхронизации в асинхронном коде. Это заблокирует все приложение, пока файл не будет прочитан. * Функции синхронизации предназначены для использования при запуске приложения, например, в системе модулей.
Евгений Костриков

3
Да, в моем случае это была непростая задача.
Арам Кочарян

2
В вашем образце кода есть ошибка опечатки, ваша path.joinбесполезна, используйте ,вместо+
Ив М.

этот код, похоже, не работает для меня, я все еще получаю ту же ошибку
aiden87

Почему это не работает, используя простой цепной путь, как ../someFolder/myFile.txt?
Мигель

42

С Узлом 0.12 это можно сделать синхронно сейчас:

  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это файловая система readFileSync () возвращает Buffer или строку, если вы спросите.

fsправильно предполагает, что относительные пути являются проблемой безопасности. pathэто обходной путь.

Чтобы загрузить в виде строки, укажите кодировку:

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

5
Не используйте какие-либо *Syncметоды при программировании для Интернета. Они подходят только для задач grunt / gulp, консольных приложений и т. Д. Они останавливают весь процесс во время чтения. Код ссылки OP, responseтак что это явно веб-приложение, где readFileSyncэто не подходит.
Сэмюэль Нефф

3
Независимо от того, есть ли другие варианты использования (и загрузка файлов в кэш при запуске, безусловно, не является одним из них), сообщение ОП явно не тот случай, когда вы хотите использовать - readFileSyncон находится в середине обработки веб-запрос. Этот ответ был совершенно неуместен для рассматриваемого вопроса.
Сэмюэль Нефф

28

1). Для 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). Для синхронизации:

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

3
вместо process.cwd () я думаю, что вы можете использовать переменную __dirname
Ишикава Йоши

2
@IshikawaYoshi process.cwd()является текущим рабочим каталогом и __dirnameкаталогом текущего модуля, поэтому они не совпадают.
A1rPun

13

простой синхронный способ с узлом:

let fs = require('fs')

let filename = "your-file.something"

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

console.log(content)

9

Запустите этот код, он будет извлекать данные из файла и отображать в консоли

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

Чтобы прочитать HTML-файл с сервера, используя httpмодуль. Это один из способов чтения файла с сервера. Если вы хотите получить его на консоли, просто удалите httpобъявление модуля.

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>


Приведенный выше код предназначен для чтения html-файла на сервере. Вы можете прочитать html-файл на сервере, создав сервер с помощью модуля "http". Это путь к файлу ответов на сервере. Вы также можете удалить модуль «http», чтобы получить его на консоли
Aaditya

1
Привет, вы можете включить свой комментарий в ответ, нажав кнопку редактирования.
Гленн Уотсон

3

Если вы хотите знать, как читать файл в каталоге и что-то с ним делать, то вы идете. Это также показывает, как выполнить команду через power shell. Это в TypeScript! У меня были проблемы с этим, поэтому я надеюсь, что это поможет кому-то однажды. Не стесняйтесь голосовать против меня, если вы считаете, что это бесполезно. Для меня это были webpackвсе мои .tsфайлы в каждой директории в определенной папке, чтобы подготовиться к развертыванию. Надеюсь, вы можете использовать его!

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);
  }
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.