백엔드단의 준비 (서버세팅, db 연결, api)가 끝났으니 이제 클라이언트 사이드 화면을 만들어 준다.
ejs는 nodes에서 html에 데이터를 입력시킬수 있게 도움을 주는 템플릿 엔진이다. 앞서 main.js 파일에 ejs template engine 세팅을 했다.
우리가 만들어둔 uploades 폴더는 퍼블릭한 폴더가 아니기때문에 웹브라우저가 접근할수 없다. 그래서 이 폴더를 static 으로 바꿔줘야 웹브라우저에서 이미지가 디스플레이 된다.
//set template engine
const express = require('express');
app.set('view engine', 'ejs');
// uploads 폴더를 static 으로 바꿔주서 웹브라우저가 요청하면 접근할수 있게 해준다
var path = require('path')
app.use(express.static(path.join(__dirname,'uploads')));
포토앨범 페이지의 뼈대 코드는 html로 만들어 놨고, views 폴더안에 index.ejs 파일로 붙여 넣기 했다. 프론트 단 보여지는 코드는 index.ejs 파일에다 입력한다.
만들어둔 인풋박스를 multippart/form-data를 form 으로 감싼다.
//파일 업로드 기능을 제공하는 form 뼈대
<form action="/" method="post" id="add-form" enctype="multipart/form-data">
<div class="input-group mb-3">
<span class="input-group-text" id="basic-addon1">@</span>
<input type="text" name="username" class="form-control" placeholder="Username" aria-label="Username" aria-describedby="basic-addon1" required/>
</div>
<div class="mb-3">
<label for="formFileMultiple" class="form-label"></label>
<input class="form-control" type="file" name="image" id="upload-file" accept = "image/jpeg, image/png" >
</div>
<div class="mb-3">
<label for="comment" class="form-label"> 자랑하기 </label>
<textarea class="form-control" name="comment" id="comment" rows="3"></textarea>
</div>
<div class="mybutton">
<div class="d-grid gap-2 d-md-block">
<input type="submit" name="submit" value="자랑하기"class="btn btn-dark"/>
</div>
</div>
</form>
if 문을 사용해서 시나리오에 맞는 코드를 실행시킨다.
//db에 등록된 file이 없으면 ejs로 지정한 html 코드에 알럿 메세지를 보여준다
<script src="ejs.js"></script>
<div class="photo-display">
<% if(message) { %>
<div class="alert alert-dismissable fade show alert- <%= message.type %>"
role="alert">
<button class="btn-close" type="button" data-bs-dismiss="alert"
aria-label="close"></button>
<strong> <%= message.message%></strong>
</div>
<% } %>
//db안에 등록된 file 있으면, loop를 사용해서 저장된 파일을 찾아서,
<%= row.name%> 으로 데이터를 html 코드에 붙여서 화면에 보여준다
<div class="row row-cols-1 row-cols-md-3 g-4">
<% if(files !='') { %>
<% files.forEach((row, index) => { %>
<div class="col">
<div class="card">
<img src="<%= row.image %>" width="300" class="card-img-top"/>
<div class="card-body">
<h5 class="card-title"> <%= row.username %></h5>
<p class="card-text"> <%= row.comment %></p>
</div>
</div>
</div>
<% }) %>
</div>
<% } else { %>
<h2 class="text-center text-secondary mt- 5"> no files found in the database</h2>
<% } %>
</div>
</div>
</script>