일부 파일 시스템 작업에 async / await를 사용하고 싶습니다. 일반적으로 async / await는 babel-plugin-syntax-async-functions
.
그러나이 코드를 사용하면 names
정의되지 않은 경우 가 발생합니다.
import fs from 'fs';
async function myF() {
let names;
try {
names = await fs.readdir('path/to/dir');
} catch (e) {
console.log('e', e);
}
if (names === undefined) {
console.log('undefined');
} else {
console.log('First Name', names[0]);
}
}
myF();
코드를 콜백 지옥 버전으로 다시 빌드하면 모든 것이 정상이며 파일 이름을 얻습니다. 힌트 주셔서 감사합니다.
답변
노드 8.0.0부터 다음을 사용할 수 있습니다.
const fs = require('fs');
const util = require('util');
const readdir = util.promisify(fs.readdir);
async function myF() {
let names;
try {
names = await readdir('path/to/dir');
} catch (err) {
console.log(err);
}
if (names === undefined) {
console.log('undefined');
} else {
console.log('First Name', names[0]);
}
}
myF();
참조 https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original를
답변
노드 11 이후 비동기 await fs 함수에 대한 기본 지원
Node.JS 11.0.0 (안정적) 및 버전 10.0.0 (실험적) 이후로 이미 약속 된 파일 시스템 메서드에 액세스 할 수 try catch
있으며 콜백의 반환 값에 다음이 포함되어 있는지 확인하는 대신 예외 처리 와 함께 사용할 수 있습니다. 오류.
API는 매우 깨끗하고 우아합니다! 단순히 개체의 .promises
구성원을 사용하십시오 fs
.
import fs from 'fs';
const fsPromises = fs.promises;
async function listDir() {
try {
return fsPromises.readdir('path/to/dir');
} catch (err) {
console.error('Error occured while reading directory!', err);
}
}
listDir();
답변
Node.js 8.0.0
네이티브 비동기 / 대기
약속하다
이 버전에서는 util 라이브러리의 기본 Node.js 함수를 사용할 수 있습니다 .
const fs = require('fs')
const { promisify } = require('util')
const readFileAsync = promisify(fs.readFile)
const writeFileAsync = promisify(fs.writeFile)
const run = async () => {
const res = await readFileAsync('./data.json')
console.log(res)
}
run()
약속 포장
const fs = require('fs')
const readFile = (path, opts = 'utf8') =>
new Promise((resolve, reject) => {
fs.readFile(path, opts, (err, data) => {
if (err) reject(err)
else resolve(data)
})
})
const writeFile = (path, data, opts = 'utf8') =>
new Promise((resolve, reject) => {
fs.writeFile(path, data, opts, (err) => {
if (err) reject(err)
else resolve()
})
})
module.exports = {
readFile,
writeFile
}
...
// in some file, with imported functions above
// in async block
const run = async () => {
const res = await readFile('./data.json')
console.log(res)
}
run()
조언
try..catch
예외를 다시 발생시키지 않으려면 항상 대기 블록에 사용하십시오 .
답변
File-Api fs.readdir
가 promise를 반환하지 않기 때문에 잘못된 동작을 생성 할 수 있습니다 . 콜백 만받습니다. async-await 구문을 사용하려면 다음과 같이 함수를 ‘약속’할 수 있습니다.
function readdirAsync(path) {
return new Promise(function (resolve, reject) {
fs.readdir(path, function (error, result) {
if (error) {
reject(error);
} else {
resolve(result);
}
});
});
}
대신 호출하십시오.
names = await readdirAsync('path/to/dir');
답변
현재 V10.0 , 당신은 사용할 수 있습니다fs.Promises
사용 예 readdir
const { promises: fs } = require("fs");
async function myF() {
let names;
try {
names = await fs.readdir("path/to/dir");
} catch (e) {
console.log("e", e);
}
if (names === undefined) {
console.log("undefined");
} else {
console.log("First Name", names[0]);
}
}
myF();
사용 예 readFile
const { promises: fs } = require("fs");
async function getContent(filePath, encoding = "utf-8") {
if (!filePath) {
throw new Error("filePath required");
}
return fs.readFile(filePath, { encoding });
}
(async () => {
const content = await getContent("./package.json");
console.log(content);
})();
답변
이것은 질문에 대한 TypeScript 버전입니다. Node 11.0 이후에 사용할 수 있습니다.
import { promises as fs } from 'fs';
async function loadMonoCounter() {
const data = await fs.readFile('monolitic.txt', 'binary');
return Buffer.from(data);
}
답변
나를 위해 일한 것은 다음과 같습니다.
const fsp = require('fs-promise');
(async () => {
try {
const names = await fsp.readdir('path/to/dir');
console.log(names[0]);
} catch (e) {
console.log('error: ', e);
}
})();
이 코드는 조화 플래그 가 활성화 된 경우 바벨없이 노드 7.6에서 작동합니다 : node --harmony my-script.js
. 그리고 노드 7.7부터는 이 플래그가 필요하지 않습니다 !
fsp
시작에 포함 된 라이브러리를위한 단지 promisified 래퍼 fs
(과 fs-ext
).
요즘 바벨없이 노드에서 할 수있는 일에 대해 정말 끝내 줬어요! 네이티브 async
/ await
코드 작성을 즐겁게 만드십시오!
업데이트 2017-06 : fs-promise 모듈은 더 이상 사용되지 않습니다. fs-extra
대신 동일한 API와 함께 사용하십시오 .