간단한 fs 코드.약속과 비동기 대기

Read in dark or mid-day mode on my blog


안녕하세요!나는 네가 나의 블로그에 뛰어드는 것을 보았다.그래, 안전벨트를 매라. 아주 즐거운 여정이 될 것이다!!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 여기에서 약속이 되돌아오기 때문에 우리는 결과를 기다릴 수 있다.그렇다면 우리는 어떻게 우리의 writeFilereadFile 방법을 약속할 것인가🤔?
다음 코드를 보십시오.
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)...writeFilereadFile의 약속을 바탕으로 한 버전을 정의했기 때문에 위의 코드는 상당히 커 보입니다.노드 자체가 내보낸 실용 함수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에서 readFilerequire(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 here
import { 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);
}
심지어 더 작아!!!

결론
네가 이 박문에서 좋은 견해를 얻을 수 있기를 바란다.

좋은 웹페이지 즐겨찾기