put 메소드 사용 ( async await / writeFileSync writeFile / readFileSync readFile 전부 사용 )

KHW·2021년 7월 20일
0

Node.js

목록 보기
16/19

목표

put 메소드 동작 구현하기


사용한 파일

app.js => express 코드
1.json => 객체형태를 저장한 파일


1. writeFileSync / readFileSync 사용

  • app.js
import express from 'express';
const app = express();
import cors from 'cors';
import fs from 'fs';

app.use(express.json());
app.use(cors());

app.put('/puts', (req,res)=>{
  const result1 = fs.writeFileSync('1.json',JSON.stringify(req.body))
  console.log('write');
  const result =fs.readFileSync('1.json','utf-8')
  console.log('read');
  res.status(201).send(result);
})

app.listen(8080);

writeFileSync 와 readFileSync를 사용해 해당 내용이 다 와서 write하기 전까지 다음 내용을 실행하지않고
read하기 전까지 다음 내용을 실행하지않는 순차적 진행을 통해

write
read

순서로 콘솔에 출력이되고 원하는 결과를 1.json파일에 넣을 수 있다.

  • 결과

    put 메소드를 통한 req를 붙여서 보내고 해당 1.json이 수정되고 원하는 결과가 반환되는 것을 볼 수 있다.


2. readFile / writeFile 사용

  • app.js
import express from 'express';
const app = express();
import cors from 'cors';
import fs from 'fs';

app.use(express.json());
app.use(cors());

function write(req){
  return new Promise(resolve=>{
    console.log('write');
    fs.writeFile('1.json',JSON.stringify(req.body),()=>{resolve()})
  })
}

function read(){
  return new Promise(resolve=>{
    console.log('read');
    fs.readFile('1.json','utf-8',(err,result)=>{resolve(result)})
  })
}

app.put('/puts', async (req,res)=>{
  const res1 = await write(req);
  const res2 = await read();
  res.status(201).send(res2);
})

app.listen(8080);

writeFile과 readFile은 비동기로 진행하므로 같이 진행시 서로간의 충돌이 발생 할 수 있다.
따라서 async await을 통해 순차적으로 실행되게 만들어야한다.

해당 put 부분의 미들웨어함수를 async로 전체를 묶고 순차적 진행을 위한 write / read 부분을 await으로 만들고
해당 함수는 new Promise를 리턴해야하므로 return 을 new Promise로 진행한다.

write의 경우 받아올 것은 없으므로 resolve로만 하고
read의 경우 수정한 값을 res.status(201).send()를 통해 request로 받고 싶으므로 resolve(result)를 한다.

각각의 writeFile과 readFile 콜백으로 resolve()가 있으므로 해당 내용이 끝나면 다음 코드가 진행되는 순차적인 진행이 가능하다.

  • 결과

    put 메소드를 통한 req를 붙여서 보내어 1.json이 수정 / request를 통해 바뀐 내용을 반환


주의할 점

writeFile / writeFileSync는 문자열을 대상으로 하므로
req.body는 객체 형태이므로 JSON.stringify(req.body)로 해야한다.


정리

파일의 수정은 쓰는것과 읽는것이 충돌되게 해서는 안된다.
즉, 순차적으로 진행해야한다.
이를 위해서 writeFileSync, readFileSync를 통해 순차적으로 진행 할 수 있고
writeFile , readFile을 쓴다면 async await를 이용해 함수를 통한 return new Promise로 순차적으로 진행 할 수 있다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글