간단한 fs 코드.약속과 비동기 대기
30673 단어 asynchronousprogrammingjavascript
안녕하세요!나는 네가 나의 블로그에 뛰어드는 것을 보았다.그래, 안전벨트를 매라. 아주 즐거운 여정이 될 것이다!!Node의 파일 시스템 API에서 가장 인기 있는 비동기식/대기 기능을 사용하는 방법을 살펴보겠습니다.
이제 파일에서 사용자 이름과 비밀번호를 읽고 암호화하는 아주 간단한 프로그램을 만들어 봅시다. (얘들아, 꼭 이렇게 해야 한다)😉), 다른 파일에 사용자 이름과 새 비밀번호를 기록합니다.
간단한 영어로 우리의 코드가 어떻게 작동하는지 적어 봅시다
1. Read the `user-data.json` file.
2. Throw error if any.
3. Extract `username`, `password` from the file contents.
4. Encrypt the password.
5. Assemble final data to be written into the new file.
6. Write the data to the `user-data-final.json` file
7. Throw error if any.
8. Output if successful
보기에 매우 간단하다.실제 코드로 쓰자.const fs = require('fs');
function main() {
fs.readFile('user-data.json', (err, data) => {
if (err) throw err;
// Let's process the data
const { username, password } = JSON.parse(data);
// Let's encrypt
const encryptedPassword = encrypt(password);
const finalObject = { username, password: encryptedPassword };
// Let's write it to another file
fs.writeFile('user-data-final.json', JSON.stringify(finalObject), (err) => {
if (err) throw err;
console.log('Successful');
});
});
}
try {
main();
} catch (e) {
console.error(e);
}
우리는 단지 오류를 포착하여 컨트롤러에 던져 마지막 try-catch
블록에 넣었을 뿐이다.이것은 효과가 있는 것 같다.
근데 심란한 일이 있어서요.내가 간단한 영어로 쓴 절차를 보고 코드를 봐라.간단한 영어 절차는 보기에 순서에 따라 점진적이다.우리가 작성한 코드는 순서였지만 모든 절차가 1단계, 7단계와 8단계가 6단계에 있는 것 같았다.요컨대
1.
2.
3.
4.
5.
6.
7.
8.
더 이상 그렇게 진지하지 않은 것 같아, 그래?코드 중의 모든 이 절차는 반드시 다른 절차에 놓아야 한다. 이것은 사람을 이상하게 느끼게 한다. 그러나 우리가 작성한 코드에서 이것은 마치 올림픽에서 횃불을 전달하는 것과 같다. (또는 어떤 횃불을 전달하는 종목에서도 나는 운동광이 아니다.)😁).나는 어떻게 해야만 코드를 습관화하고 그것에 기초한 절차를 반영할 수 있습니까?
솔루션
리셋 모드는
async / await
로 대체할 수 있다.우리는 그것들을 사용하여 코드를 매우 평평하게 할 수 있다.그러나 await
는 약속에만 적용된다.const result = await fetch('https://api.example.com');
fetch
여기에서 약속이 되돌아오기 때문에 우리는 결과를 기다릴 수 있다.그렇다면 우리는 어떻게 우리의 writeFile
와 readFile
방법을 약속할 것인가🤔?다음 코드를 보십시오.
const readFile = (path) =>
new Promise((resolve, reject) =>
fs.readFile(path, (err, data) => {
if (err) reject(err);
resolve(data);
})
);
이것은 약속에 기반한readFile 함수입니다.우리는 이렇게 간단하게 그것을 사용할 수 있다👇const data = await readFile('user-data.json');
이것은 파일을 읽고 데이터가 통과된 후에 다음 줄을 계속합니다.움츠러들지 않고, 가지도 없고, 아무것도 없다, 나다!!괜찮아 보여요.이 방법으로 완전한 코드를 실현합시다.const fs = require('fs');
const readFile = (path) =>
new Promise((resolve, reject) =>
fs.readFile(path, (err, data) => {
if (err) reject(err);
resolve(data);
})
);
const writeFile = (path, data) =>
new Promise((resolve, reject) =>
fs.writeFile(path, data, (err) => {
if (err) reject(err);
resolve();
})
);
async function main() {
const data = await readFile('user-data.json');
// Extract
const { username, password } = JSON.parse(data);
// Let's encrypt
const encryptedPassword = encrypt(password);
const finalObject = { username, password: encryptedPassword };
// Let's write to another file
await writeFile('user-data-final.json', JSON.stringify(finalObject));
console.log('Successful');
}
try {
main();
} catch (e) {
console.error(e);
}
우리의 주요 기능을 봐라.전체 코드는 더 크지만, 우리의 main
함수 (실제 논리) 는 훨씬 간단하고, 실제로는 우리가 상상하는 관용 방식에 따라 우리가 작성한 절차를 따랐다.더 간단한 방법(utils.promisify)...
writeFile
와 readFile
의 약속을 바탕으로 한 버전을 정의했기 때문에 위의 코드는 상당히 커 보입니다.노드 자체가 내보낸 실용 함수promisify
를 사용하면 우리는 그것을 더욱 작게 할 수 있다.사용법👇
const { promisify } = require('util');
const fs = require('fs');
const writeFile = promisify(fs.writeFile);
리셋에 기반한 함수를 promisify
함수에 전달하기만 하면 돼!약속에 기반한 원시 기능 버전이 있습니다.그래서 저희 코드가 지금 바뀌었어요.👇
const { promisify } = require('util');
const fs = require('fs');
const writeFile = promisify(fs.writeFile);
const readFile = promisify(fs.readFile);
async function main() {
const data = await readFile('user-data.json');
// Extract
const { username, password } = JSON.parse(data);
// Let's encrypt
const encryptedPassword = encrypt(password);
const finalObject = { username, password: encryptedPassword };
// Let's write to another file
await writeFile('user-data-final.json', JSON.stringify(finalObject));
console.log('Successful');
}
try {
main();
} catch (e) {
console.error(e);
}
훨씬 작다😍....가장 쉬운 방법!
이제 소매 속의 히든카드를 소개해 드릴게요!버전 10부터 기본적으로 NodeJS는 약속에 기반한 방법 버전을 내보냅니다.
require('fs').promises
를 통해 액세스할 수 있습니다.다음은 이 방법을 사용하는 최종 코드입니다.
const { writeFile, readFile } = require('fs').promises;
async function main() {
const data = await readFile('user-data.json');
// Extract
const { username, password } = JSON.parse(data);
// Let's encrypt
const encryptedPassword = encrypt(password);
const finalObject = { username, password: encryptedPassword };
// Let's write to another file
await writeFile('user-data-final.json', JSON.stringify(finalObject));
console.log('Successful');
}
try {
main();
} catch (e) {
console.error(e);
}
첫 줄을 주의해라.우리는 writeFile
에서 readFile
와 require(fs).promises
방법을 직접 도입했다.이것은 현재 노드에서 찾을 수 있는 가장 좋고 가장 깨끗한 버전이다.코드 규약
현재 당신은 어떻게 사용하는지
fs.promises
알고 있습니다. 이 코드를 사용하는 가장 좋은 모델을 찾아보겠습니다.단일 함수 가져오기
const { writeFile, readFile, access } = require('fs').promises;
이것은 아마도 가장 편리한 방법일 뿐만 아니라 가장 깨끗한 방법일 것이다.그러나 일반 fs
모듈에서 일부 내용을 가져와야 할 때 문제가 발생합니다.예컨대👇const { writeFile, readFile, access } = require('fs').promises;
const { writeFileSync, createReadStream, createWriteStream } = require('fs');
약속 기반 함수와 일반 fs
에서 온 함수, 예를 들어streams를 가져오고 있습니다.현재 주 논리에서 직접 사용할 수 있지만, 때때로 파일의 코드가 충분할 때, 나는 프로미스 기반 버전의 Wait를 정확하게 사용하지 않는다. 어떤 방법이 어디서 왔는지 혼란스러울 수 있기 때문에, 가져오기를 보기 위해 끝까지 스크롤해야 한다.이것은 큰 문제가 아닌 것 같지만, 이 코드를 작성하고 6개월 후에 다시 작성하는 것을 권장합니다.너도 같은 곤경에 빠질 거야.😂
네임스페이스로 가져오기
이것은 내가 가장 좋아하는 방법이다.
const fs = require('fs');
const fsp = fs.promises; // 👈 This line
...
await fsp.writeFile();
fs.createReadStream();
ES 수입
이제 노드에서 ES 가져오기(일부 추가 조정)를 사용할 수 있으므로 모듈식 버전을 고려해 보겠습니다.
import { promises as fsp } from 'fs';
async function main() {
const data = await fsp.readFile('user-data.json');
// Extract
const { username, password } = JSON.parse(data);
// Let's encrypt
const encryptedPassword = encrypt(password);
const finalObject = { username, password: encryptedPassword };
// Let's write to another file
await fsp.writeFile('user-data-final.json', JSON.stringify(finalObject));
console.log('Successful');
}
try {
main();
} catch (e) {
console.error(e);
}
또한 노드 버전이 v14를 초과하면8.0, 당신도 top level await를 직접 사용할 수 있습니다. (그것에 관한 글이 있습니다. right hereimport { promises as fsp } from 'fs';
try {
const data = await fsp.readFile('user-data.json');
// Extract
const { username, password } = JSON.parse(data);
// Let's encrypt
const encryptedPassword = encrypt(password);
const finalObject = { username, password: encryptedPassword };
// Let's write to another file
await fsp.writeFile('user-data-final.json', JSON.stringify(finalObject));
console.log('Successful');
} catch (e) {
console.error(e);
}
심지어 더 작아!!!결론
네가 이 박문에서 좋은 견해를 얻을 수 있기를 바란다.
Reference
이 문제에 관하여(간단한 fs 코드.약속과 비동기 대기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/puruvj/simple-code-with-fs-promises-and-async-await-1j7i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)