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

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

로그 undefined, 왜?



답변

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


답변

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

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)


답변

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


답변

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


답변

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

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


답변

이 라인은 작동합니다

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


답변

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!");
      });
    });
  }