간단한 설치 및 내용은 이곳에 자세히 설명되어있다.
- node_modules(자동 생성)
- data
- data.json
- db.js
- public
- js
○ app.js- index.html
- index.js
- package.json (자동 생성)
const fs = require('fs')
// data.json만 사용할 것입니다.
const path = __dirname + '/data.json'
const getData = _ => new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (err, data) => {
err ? reject(err) : resolve(JSON.parse(data || null))
})
})
const setData = data => new Promise((resolve, reject) => {
fs.writeFile(path, JSON.stringify(data), 'utf-8', err => {
err ? reject(err) : resolve()
})
})
module.exports = {getData, setData}
{
"folder": [],
"task": []
}
// 외부 모듈 import
const express = require('express')
const db = require('./data/db.js')
const app = express()
// middle ware 등록
app.use(express.json()) // request body를 사용하기 위함
app.use(express.static('public')) // static file을 사용하기 위함
// index page
app.get('/', (req, res) => {
res.render('index') // index.html render
})
// folder
app.route('/api/folder')
.get(async (req, res) => {
const result = {success: true}
try {
const json = await db.getData()
result.data = json.folder
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
.post(async (req, res) => {
const result = {success: true}
const folder = req.body.folder
try {
const json = await db.getData()
json.folder = folder
await db.setData(json)
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
// task
app.route('/api/task')
.get(async (req, res) => {
const result = {success: true}
try {
const json = await db.getData()
result.data = json.task
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
app.route('/api/task/:parent')
.get(async (req, res) => {
const result = {success: true}
const parent = req.params.parent
try {
const json = await db.getData()
list = []
json.task.forEach((v, idx) => {
if (v.parent === parent) {
v.idx = idx
list.push(v)
}
})
result.data = list
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
.post(async (req, res) => {
const result = {success: true}
const task = req.body.task
const parent = req.params.parent
try {
const json = await db.getData()
task.parent = parent
json.task.push(task)
await db.setData(json)
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
.put(async (req, res) => {
const result = {success: true}
const task = req.body.task
const idx = req.params.parent
try {
const json = await db.getData()
json.task[idx] = task
await db.setData(json)
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
app.listen(3000)
app.route('/api/folder')
.get(async (req, res) => {
const result = {success: true}
try {
const json = await db.getData()
result.data = json.folder
} catch (err) {
result.success = false
result.err = err
}
res.json(result) // response형태로 result에 모은 내용을 보낸다.
})
http://127.0.0.1:3000/api/folder
로 접속 했을때의
get 메소드에서(가져오기)
try 메소드를 통해 db(const db = require('./data/db.js')
)에 있는 파일을json
변수에 가져오는데 해당 json의 folder 프로퍼티 부분만 result라는 결과의 data 프로퍼티로 가져오는 처리를 한다.
ex) 만약 db.js가 아래와 같다면
db.js
{
"folder": [
{"name": "첫번째 폴더입니다."}
],
"task": []
}
http://127.0.0.1:3000/api/folder
에 접속하면 아래와 같이folder
프로퍼티만data
프로퍼티로 처리되어 나타난다.
app.route('/api/folder')
.post(async (req, res) => {
const result = {success: true}
const folder = req.body.folder
try {
const json = await db.getData()
json.folder = folder
await db.setData(json)
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
Post 메소드를 이용해 body부분에 raw에서 JSON 형태로 send를 한다.
(JSON 형태로 하지않으면 제대로 전달되지않아 오류뜬다!!!!!)
전달했던 folder부분 내용이
http://127.0.0.1:3000/api/folder
를 확인하며 저장된것을 알 수 있다.
실제 db.js 파일에도 send 후에 데이터가 추가된 것을 알 수 있다.
app.route('/api/task/:parent')
.get(async (req, res) => {
const result = {success: true}
const parent = req.params.parent
try {
const json = await db.getData()
list = []
json.task.forEach((v, idx) => {
if (v.parent === parent) {
v.idx = idx
list.push(v)
}
})
result.data = list
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
마찬가지로 db에 존재하는
task
프로퍼티를 순회하며 같은 값을 list에 넣어주며 저장된 list를 result data프로퍼티 형태로 처리한다.
app.route('/api/task/:parent')
.post(async (req, res) => {
const result = {success: true}
const task = req.body.task
const parent = req.params.parent
try {
const json = await db.getData()
task.parent = parent
json.task.push(task)
await db.setData(json)
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
마찬가지로 task안에 넣어서 send한다.
이를 확인해보면 추가된 것을 확인할 수있고
db.js에서 또한 해당 부분이 추가된 것을 알 수 있다.
app.route('/api/task/:parent')
.put(async (req, res) => {
const result = {success: true}
const task = req.body.task
const idx = req.params.parent
try {
const json = await db.getData()
json.task[idx] = task
await db.setData(json)
} catch (err) {
result.success = false
result.err = err
}
res.json(result)
})
수정하는 put 형태를 만든다.
put 메소드를 통해 name 부분을 수정한 것을 send하였다.
해당 결과로 기존의 내용이 수정되었고
db.js 또한 마찬가지로 수정되었다.
fetch('http://localhost:3000/api/task/0',{
method:"PUT",
headers : {"Content-Type" : "application/json"},
body : JSON.stringify({
"task": {
"name": "첫번째 task 또 또 jj수정",
"state": true,
"parent": "0",
"idx": 0
}
})
})
body
부분에서 JSON
형태를 꼭 설정해야 정상적으로 동작한다.res.json(변수)
부분을 생각하고 있는 것이 좋다.