Прочитайте файл у Node.js


186

Я дуже спантеличений читанням файлів у 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'] errno: 34, код: 'ENOENT', шлях: './start.html'}

Будь-які ідеї?


8
Швидше за все, файл не там, де ви / код думає, що він є. Якщо файл знаходиться в тому ж каталозі, що і сценарій, спробуйте:path.join(__dirname, 'start.html')
— dc5

1
Чи можете ви console.log ("__ dirname:" + __dirname); прямо перед тим, як вивести помилку? Це покаже, який каталог локальний для вашого виконуваного на той момент. Ви можете зробити щось, щоб змінити своє місцезнаходження, і, можливо, ви потрапили на це, можливо, код не працює у __dirname, де ви вважаєте, що це.
— Брайан

Файл повинен знаходитися в тому самому каталозі, з якого ви запускаєте процес вузла. Отже, якщо файл знаходиться у dir / node / index.html, і ваш файл app.js, але ви робите: node /dir/node/app.js Тоді ви отримуєте помилку. Рішення dc5 повинно зробити трюк.
— Еван Шортис

Вам слід закрити це питання або надіслати свою редагування як відповідь і прийняти її.
— ChrisCM

використовувати path.join(__dirname, '/filename.html')і взяти довідку з stackoverflow.com/a/56110874/4701635
— Paresh Барад

Відповіді:


237

Використання 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

З Node 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 () повертає буфер або рядок, якщо ви запитаєте.

fsправильно припускає, що відносні шляхи є проблемою безпеки. pathце обхід.

Щоб завантажити як рядок, вкажіть кодування:

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

5
Не використовуйте жодних *Syncметодів при програмуванні в Інтернеті. Вони підходять лише для завдань з грунтом / глотком, консольних програм тощо. Вони призупиняють весь процес під час читання. Код ОП посилається, 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
— Ishikawa Yoshi

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", щоб
— перенести

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.