본문 바로가기

Programming/Node.js

5. http 모듈로 서버 만들기 (2) - REST와 라우팅 [4]

node js logo image

 

 

 

앞선 아티클에서 작성한 RESTful 서버 구현 예제를 이어서 진행해 보겠습니다. 

 

 

 

 

[restFront.css]

a {
    color: blue;
    text-decoration: none;
}

 

 

 

[restFront.html]

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>RESTful SERVER EXAMPLE</title>
    <link rel="stylesheet" href="./restFront.css" />
</head>
<body>
    <nav>
        <a href="/">home</a>
        <a href="/about">about</a>
    </nav>
    <div>
        <form id="form">
            <input type="text" id="username">
            <button type="submit">등록하기</button>
        </form>
    </div>
    <div id="list"></div>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="./restFront.js"></script>
</body>
</html>

 

 

[restFront.js]

 

// 로딩 시 사용자 정보를 가져오는 함수
async function getUser() {
    try {
        const res = await axios.get('/users');
        const users = res.data;
        const list = document.getElementById('list');
        list.innerHTML = '';

        // 사용자마다 반복적으로 화면 표시 및 이벤트 연결
        Object.keys(users).map(function (key) {
            const userDiv = document.createElement('div');
            const span = document.createElement('span');
            span.textContent = users[key];
            const edit = document.createElement('button');
            edit.textContent = '수정';
            // 수정 버튼 클릭
            edit.addEventListener('click', async () => {
                const name = prompt('바꿀 이름을 입력하세요');
                if (!name) {
                    return alert('이름을 반드시 입력하쇼');
                }
                try {
                    await axios.put('/user/' + key, { name });
                    getUser();
                } catch (err) {
                    console.error(err);
                }
            });

            const remove = document.createElement('button');
            remove.textContent = '삭제';
            // 삭제 버튼 클릭
            remove.addEventListener('click', async () => {
                try {
                    await axios.delete('/user/' + key);
                    getUser();
                } catch (err) {
                    console.error(err);
                }
            });

            userDiv.appendChild(span);
            userDiv.appendChild(edit);
            userDiv.appendChild(remove);
            list.appendChild(userDiv);
            console.log(res.data);
        });
    } catch (err) {
        console.error(err);
    }
}

// 화면이 로드될 때 getUser 호출
window.onload = getUser;

// form 제출(submit) 시 실행
document.getElementById('form').addEventListener('submit', async (e) => {
    e.preventDefault();
    const name = e.target.username.value;
    if (!name) {
        return alert('이름 입력 필요함');
    }
    try {
        await axios.post('/user', { name });
        getUser();
    } catch (err) {
        console.error(err);
    }
    e.target.username.value = '';
});

 

 

 

 

 

[about.html]

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>RESTful SERVER</title>
    <link rel="stylesheet" href="./restFront.css">
</head>
<body>
    <nav>
        <a href="/">home</a>
        <a href="/about">about</a>
    </nav>
    <div>
        <h2>소개 페이지</h2>
        <p>사용자 이름을 등록하시오.</p>
    </div>
</body>
</html>