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