웹(WEB)/자바스크립트(JS)

Node.js Firebase 연동, 데이터 파싱(2) getDoc, doc, dayjs

마달랭 2024. 8. 28. 14:04
반응형

개요

  1. Node.js Firebase 연동, 데이터 파싱 collection, getDocs

이전 글에서는 데이터를 파싱해와 컬렉션을 배열 형태로 받아왔다면 이번엔 id를 파라미터 형식으로 전달하여 한개의 필드를 받아오는 방법에 대해 알아보자

해당 내용을 사용하여 게시판 형식에서 게시글을 단일로 조회 할 수 있다.

 

관련 메서드

  • doc : 컬렉션에서 id 에 해당하는 게시글을 가져옴
  • getDoc : 해당 문서를 snapshot 형태로 한가지를 가져옴
  • docSnapshot.exists() : 문서가 존재하는지 boolean 리턴

 

javascript 코드 작성

코드 article.js

// 이전 글 참조
import { db } from "..\app.js";

import {
    getDoc, doc,
} from "https://www.gstatic.com/firebasejs/10.12.2/firebase-firestore.js";

async function getArticle(id) {
    try {
    	// id를 매개변수로 받아 articles 컬렉션 내 특정 id를 갖는 문서 정보를 초기화
        const docRef = await doc(db, "articles", id);
        // 문서 정보를 갖고 필드 정보를 가져온다.
        const docSnapshot = await getDoc(docRef);
        if (docSnapshot.exists()) { // 성공적으로 필드 정보를 가져 왔다면
            const article = { // article 객체 생성
                id: docSnapshot.id, 
                ...docSnapshot.data(),
            };
            return article; article 객체 리턴
        } else {
            return 404;
        }
    } catch (error) {
        return error.code;
    }
}

export { getArticle }; // 해당 함수를 모듈화 한다.

 

HTML 코드 작성

코드 detail.html

<html>
    <body>
        <h1>게시글 상세조회</h1>
        <div>
            <span>id: </span>
            <span class="id-data"></span>
        </div>
        <div>
            <span>title: </span>
            <span class="title-data"></span>
        </div>
        <div>
            <span>content: </span>
            <span class="content-data"></span>
        </div>
        <div>
            <span>createdAt: </span>
            <span class="created-at-data"></span>
        </div>
        <div>
            <span>updatedAt: </span>
            <span class="updated-at-data"></span>
        </div>
        <a class="update-link" href="#">게시글 수정</a>
        <button class="delete-btn">게시글 삭제</button>
        <br />
        <a href="./list.html">게시글 목록으로 돌아가기</a>
        // dayjs를 사용하기 위해 CDN 첨부
        <script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.11/dayjs.min.js"></script>
        <script type="module">
            import {getArticle, deleteArticle} from "./article.js";
            // 현재 URL에서 파라미터를 뽑아온다.
            const params = new URLSearchParams(location.search);
            // 파라미터에서 id 값을 뽑아온다.
            const id = params.get("id");
            // firestore에서 id에 해당하는 필드 정보를 가져온다.
            const result = await getArticle(id);
            // 필드 정보 내 timestamp 형식의 변수를 YYYY.MM.DD HH:mm:ss 형식으로 변환한다.
            const parsedStep1CreatedAt = new Date(result.createdAt.seconds * 1000);
            const parsedStep1UpdatedAt = new Date(result.updatedAt.seconds * 1000);
            const parsedStep2CreatedAt = dayjs(parsedStep1CreatedAt).format(
                "YYYY.MM.DD HH:mm:ss"
            );
            const parsedStep2UpdatedAt = dayjs(parsedStep1UpdatedAt).format(
                "YYYY.MM.DD HH:mm:ss"
            );
            // HTML의 클래스를 참조
            const id_data = document.querySelector('.id-data');
            const title_data = document.querySelector('.title-data');
            const content_data = document.querySelector('.content-data');
            const created_at_data = document.querySelector('.created-at-data');
            const updated_at_data = document.querySelector('.updated-at-data');
            // 해당 클래스의 textContent를 변경한다.
            id_data.textContent = result.id;
            title_data.textContent = result.title;
            content_data.textContent = result.content;
            created_at_data.textContent = parsedStep2CreatedAt;
            updated_at_data.textContent = parsedStep2UpdatedAt;
        </script>
    </body>
</html>

 

결과

Day.js

Date 파싱 라이브러리, 매우 가볍고, 빠르게 동작한다.
Date 형식의 변수를 원하는 형태의 format으로 파싱이 가능하다.

728x90
반응형