fs.readFile에서 데이터 가져 오기


296
var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

로그 undefined, 왜?


1
fs.readFileSync에는 파일이 유니 코드 utf8 형식 인 경우에도 파일을 읽을 수있는 멋진 기능이 있습니다.
Praneeth

NB fs.readFile 또한 그렇게 할 수 있습니다 ^ 아래 답변을보십시오
Dominic

답변:


348

@Raynos가 말한 것을 자세히 설명하기 위해 정의한 함수는 비동기 콜백입니다. 즉시 실행되지 않고 파일로드가 완료되면 실행됩니다. readFile을 호출하면 제어가 즉시 리턴되고 다음 코드 행이 실행됩니다. 따라서 console.log를 호출 할 때 콜백이 아직 호출되지 않았으며이 컨텐츠가 아직 설정되지 않았습니다. 비동기식 프로그래밍에 오신 것을 환영합니다.

접근 예

const fs = require('fs');
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    const content = data;

    // Invoke the next step here however you like
    console.log(content);   // Put all of the code here (not the best solution)
    processFile(content);   // Or put the next step in a function and invoke it
});

function processFile(content) {
    console.log(content);
}

또는 Raynos 예제에서 볼 수 있듯이 함수를 호출하고 자신의 콜백을 전달하십시오. 콜백이 필요한 함수로 비동기 호출을 래핑하는 습관을들이는 것은 많은 문제와 지저분한 코드를 절약 할 수 있다고 생각합니다.

function doSomething (callback) {
    // any async callback invokes callback with response
}

doSomething (function doSomethingAfter(err, result) {
    // process the async result
});

2
Sync I / O가 그 자리를 차지하고 있습니다. 소규모 빌드 시스템이나 도구를 사용하는 것이 좋습니다. 더 큰 시스템이나 서버 앱에서는이를 피하는 것이 가장 좋습니다.
RobW

27
모든 것이 웹 서버는 아닙니다. 그리고 서버가 요청을 받기 전에 원샷 호출에 동기화 버전의 메소드를 사용하는 것에 대해 끔찍한 일은 없습니다. Node를 사용하는 사람은 사용하기 전에 이유를 이해해야합니다. 확실하게 블로깅하기 전에.
Erik Reppen


7
'utf8'파일 이름 뒤에 추가 매개 변수로 포함해야합니다 . 그렇지 않으면 버퍼 만 반환됩니다. 참조 : stackoverflow.com/questions/9168737/…
DollarAkshay

252

실제로 이것을위한 동기 함수가 있습니다 :

http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

비동기

fs.readFile(filename, [encoding], [callback])

파일의 전체 내용을 비동기 적으로 읽습니다. 예:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

콜백에는 두 개의 인수 (err, data)가 전달되며 여기서 data는 파일의 내용입니다.

인코딩을 지정하지 않으면 원시 버퍼가 반환됩니다.


동기식

fs.readFileSync(filename, [encoding])

fs.readFile의 동기 버전 filename이라는 파일의 내용을 반환합니다.

인코딩이 지정된 경우이 함수는 문자열을 반환합니다. 그렇지 않으면 버퍼를 반환합니다.

var text = fs.readFileSync('test.md','utf8')
console.log (text)

빠른 질문, readFile의 동기 버전에서 반환되는 버퍼의 사용은 무엇입니까? 파일을 동 기적으로 읽고 인코딩을 전달하지 않으면 버퍼가 인쇄됩니다. 어떻게 사용합니까? 감사합니다.
codingbbq

12
나는 최근에 이것을 경험했다. 버퍼가라고 가정 해 봅시다 data. if (Buffer.isBuffer( data){ result = data.toString('utf8'); }이제 버퍼를 읽을 수있는 텍스트로 변환했습니다. 일반 텍스트 파일을 읽거나 형식 유형에 대해 파일을 테스트하는 데 유용합니다. 예를 들어 JSON 파일인지 확인하기 위해 try / catch를 수행 할 수 있습니다. 버퍼가 텍스트로 변환 된 후에 만 ​​가능합니다. 자세한 정보는 여기를보십시오 : nodejs.org/api/buffer.html
Logan

또한 내가 아는 한 버퍼는 옥텟 스트림이며 데이터를 "조각 씩"보내는 데 좋습니다. 버퍼가 같은 것을 보았을 것 AF 42 F1입니다. 클라이언트-서버-클라이언트 통신에 매우 실용적입니다.
Logan

113
function readContent(callback) {
    fs.readFile("./Index.html", function (err, content) {
        if (err) return callback(err)
        callback(null, content)
    })
}

readContent(function (err, content) {
    console.log(content)
})

6
덕분에 아주 많이, 내가 15마르크이 있다면, 난 당신의 대답 : 투표를 것
karaxuna

안녕, 코드의 첫 번째 줄에, function readContent(callback)이다 callback예약어는? 내 말은 이것이 사용자 정의 함수에 대한 콜백을 구현하는 표준 방법입니까? 방금 노드 학습을 시작했습니다.
아말 안토니

3
안녕 아말 콜백은 단순히 자신의 함수에 전달 된 인수, 그것은 수 event또는 c나처럼 어떤 이름 당신 - 그것은 자바 스크립트에서 예약어 아니다, 나는 동일 Node.js. 확장 생각할 겁니다
RealDeal_EE'18 1

readContent(function (err, content)함수를 매개 변수로 사용할 때 구문 오류가 발생합니다.
monsto

66

ES7과 함께 약속 사용

mz / fs와의 비동기 사용

mz모듈은 약속 된 버전의 코어 노드 라이브러리를 제공합니다. 그것들을 사용하는 것은 간단합니다. 먼저 라이브러리를 설치하십시오 ...

npm install mz

그때...

const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
  .catch(err => console.error(err));

또는 비동기 함수로 작성할 수 있습니다.

async function myReadfile () {
  try {
    const file = await fs.readFile('./Index.html');
  }
  catch (err) { console.error( err ) }
};

6
이것은 미래이며 모두에 의해 높은 평가를 받아야합니다 :) 감사합니다
PirateApp

2
재미있어 보인다. 하나의 오타 : 'console.error (catch)'는 'console.error (err)'이어야합니다).
philwalk

2
추가 패키지를 추가하지 않으려면 아래
@doctorlee

18
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');

출력을 버퍼로 표시하는 인코딩없이 파일을 동 기적으로 호출하는 데 사용하십시오.


2
예쁜 인쇄를 시작하려면 코드 블록 앞에 빈 줄이 필요합니다.
royhowie 2016 년

브리핑 및 최고!
Diamond

12

이 라인은 작동합니다

const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);

1
7 년이 지났습니다 :) fs.readFileSync동기화 방법이므로 await거기에 필요가 없습니다. Await 는 동기화 코드와 유사한 구문으로 비동기 코드를 작성하려는 경우 promise ( nodejs.org/api/fs.html#fs_fs_promises_api )에 유용 합니다.
karaxuna

@karaxuna, 예. 제거되었습니다. 나는 오늘이 사례를 발견하고 위의 코드를 사용하여 해결했습니다.
Aravin

1
이것이 가장 간단한 대답입니다. 비동기가 필요하지 않은 경우 왜 세계에서 콜백, 비동기 / 대기 등 비동기 버전과 전혀 혼합하지 않습니까? 이것은 갈 길입니다.
오리의 주인

8
const fs = require('fs')
function readDemo1(file1) {
    return new Promise(function (resolve, reject) {
        fs.readFile(file1, 'utf8', function (err, dataDemo1) {
            if (err)
                reject(err);
            else
                resolve(dataDemo1);
        });
    });
}
async function copyFile() {

    try {
        let dataDemo1 = await readDemo1('url')
        dataDemo1 += '\n' +  await readDemo1('url')

        await writeDemo2(dataDemo1)
        console.log(dataDemo1)
    } catch (error) {
        console.error(error);
    }
}
copyFile();

function writeDemo2(dataDemo1) {
    return new Promise(function(resolve, reject) {
      fs.writeFile('text.txt', dataDemo1, 'utf8', function(err) {
        if (err)
          reject(err);
        else
          resolve("Promise Success!");
      });
    });
  }

5
답에 코드를 넣지 말고 왜 다른지, 어떻게 문제를 해결하는지 설명하십시오.
Studocwho

@doctorlee 이것은 실제로 외부 라이브러리없이 저에게 효과적입니다. 반드시 설명이 필요합니다.
Ashutosh Chamoli

7

동기화 및 비동기 파일 읽기 방법 :

//fs module to read file in sync and async way

var fs = require('fs'),
    filePath = './sample_files/sample_css.css';

// this for async way
/*fs.readFile(filePath, 'utf8', function (err, data) {
    if (err) throw err;
    console.log(data);
});*/

//this is sync way
var css = fs.readFileSync(filePath, 'utf8');
console.log(css);

노드 치트 read_file 에서 사용 가능 합니다.


7

말한 것처럼 fs.readFile비동기 작업입니다. 즉, 노드에게 파일을 읽도록 지시 할 때 시간이 걸리는 것을 고려해야하며 그 동안 노드는 계속해서 다음 코드를 실행해야합니다. 귀하의 경우 : console.log(content);.

긴 파일을 읽는 것과 같이 긴 여행을 위해 코드의 일부를 보내는 것과 같습니다.

내가 쓴 의견을 살펴보십시오.

var content;

// node, go fetch this file. when you come back, please run this "read" callback function
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});

// in the meantime, please continue and run this console.log
console.log(content);

그렇기 때문에 content로그인 할 때 여전히 비어 있습니다. node가 아직 파일 내용을 검색하지 않았습니다.

이 문제 console.log(content)는 콜백 함수 내부로 바로 이동하여 해결할 수 있습니다 content = data;. 이렇게하면 노드가 파일 읽기를 마치고 content값 을 얻은 후 로그를 볼 수 있습니다 .


6

내장 된 Promisify 라이브러리 (노드 8+)를 사용하여 이러한 기존 콜백 기능을보다 우아하게 만듭니다.

const fs = require('fs');
const util = require('util');

const readFile = util.promisify(fs.readFile);

async function doStuff() {
  try {
    const content = await readFile(filePath, 'utf8');
    console.log(content);
  } catch (e) {
    console.error(e);
  }
}

const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');util.promisify 랩이 필요하지 않고 한 줄에있을 수 있습니다 .
rab

1
동기화 버전을 사용하지 않는 것이 중요하며, 호출시 오류를 처리해야합니다.
Dominic

4
var fs = require('fs');
var path = (process.cwd()+"\\text.txt");

fs.readFile(path , function(err,data)
{
    if(err)
        console.log(err)
    else
        console.log(data.toString());
});

2
var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

이것은 노드가 비동기 적이며 읽기 기능을 기다리지 않고 프로그램이 시작하자마자 값을 정의되지 않은 것으로 콘솔 링합니다. 이는 실제로 컨텐츠 변수에 할당 된 값이 없으므로 사실입니다. 우리는 약속, 생성기 등을 사용할 수 있습니다. 이런 식으로 약속을 사용할 수 있습니다.

new Promise((resolve,reject)=>{
    fs.readFile('./index.html','utf-8',(err, data)=>{
        if (err) {
            reject(err); // in the case of error, control flow goes to the catch block with the error occured.
        }
        else{
            resolve(data);  // in the case of success, control flow goes to the then block with the content of the file.
        }
    });
})
.then((data)=>{
    console.log(data); // use your content of the file here (in this then).    
})
.catch((err)=>{
    throw err; //  handle error here.
})

2

다음은 async랩 또는 약속 then체인에 작동하는 기능입니다.

const readFileAsync =  async (path) => fs.readFileSync(path, 'utf8');

1

당신은 파일을 읽을 수 있습니다

var readMyFile = function(path, cb) {
      fs.readFile(path, 'utf8', function(err, content) {
        if (err) return cb(err, null);
        cb(null, content);
      });
    };

추가하면 파일에 쓸 수 있습니다.

var createMyFile = (path, data, cb) => {
  fs.writeFile(path, data, function(err) {
    if (err) return console.error(err);
    cb();
  });
};

심지어 그것을 연결

var readFileAndConvertToSentence = function(path, callback) {
  readMyFile(path, function(err, content) {
    if (err) {
      callback(err, null);
    } else {
      var sentence = content.split('\n').join(' ');
      callback(null, sentence);
    }
  });
};

1

대략적으로 말하면, 본질적으로 비동기적인 node.js를 다루고 있습니다.

비동기에 관해 이야기 할 때, 우리는 다른 것을 다루면서 정보 나 데이터를 처리하거나 처리하는 것에 대해 이야기하고 있습니다. 병렬과 동의어가 아닙니다.

귀하의 코드 :

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

샘플에서는 기본적으로 console.log 부분을 먼저 수행하므로 변수 'content'가 정의되지 않습니다.

실제로 출력을 원하면 다음과 같이하십시오.

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
    console.log(content);
});

이것은 비동기입니다. 익숙해지기 어려울 지 모르지만 그것이 바로 그것입니다. 다시 말하지만 이것은 비동기가 무엇인지에 대한 거칠지 만 빠른 설명입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.