Node.js + Express 앱(리스트의 항목별로 코멘트를 달 수 있음)에서, 첫 번째 항목의 코멘트란에 입력한 경우에는 값이 전송되고 콘솔에서 확인 가능했으나, 나머지 항목의 코멘트란에 입력한 경우에는 값 전송 및 콘솔 확인이 되지 않았다. (깃허브에서 보기)
첫 번째 항목의 코멘트란에 값을 입력하고 전송한 경우
두 번째 항목의 코멘트란에 값을 입력하고 전송한 경우
Node.JS 14.19.1
NPM 6.14.16
form submit 시, 함수 실행되게 하는 것 및 form 입력값의 출처가 오로지 첫 번째 form으로만 한정되어 있었음.
코드(편집본)
home.pug
each article in data
form#commentForm
input(type="text", value="article.clickedDate)
button(type="submit")="Submit!"
script(src="static/js/comment.js")
comment.js
const form = document.getElementById("commentForm")
const handleSubmit = async (event) => { // async는 없어도 무방. async/await의 정확한 사용법을 몰랐을 때의 실수.
event.preventDefault();
const input = form.querySelector("input"); // submit event를 활용하려면 event.target.querySelector("input");이어야 함.
const comment = input.value;
console.log(comment);
}
if (form) {
form.addEventListener("submit", handleSubmit); // 첫 번째 폼에만 addEventListener 붙음
}
항목별로 submit event를 캐치할 수 있게 함.
form(onsubmit="test(event)")
을 루프문
으로 할당.const input = event.target.querySelector("input");
으로 인식.코드(편집본)
home.pug
each article in data
form(onsubmit="test(event)")
input(type="text", id=article.date, value="")
button(type="submit")="Submit!"
script(src="static/js/comment.js")
comment.js
const test = (event) => {
event.preventDefault();
const input = event.target.querySelector("input");
const value = input.value;
console.log(value);
}
위의 이슈 해결 과정에서 알게 된 지식을 정리하였다.
form의 값을 프론트엔드/백엔드 어디로 submit하느냐에 따른 차이점을 알아보았다.
JavaScript의 함수에 넘기기 (Front-end)
Form에서 서버로 값을 보내기 전에, 값을 검증하거나 추가적인 로직이 필요한 경우 Frone-end 처리를 사용한다.
방법 1) onsubmit
사용
방법 2) addEventListener
사용
onsubmit
vs. addEventListener
?
Express 함수에 넘기기 (Back-end)
방법 1) req.body
사용
form(method="POST")
input(name="title", type="text", value="")
input(name="desc", type="text", value="")
input(name="tags", type="text", value="")
input(type="submit", value="Upload")
videoRouter.route("/upload").get(getUpload).post(postUpload);
export const postUpload = async (req, res) => {
const { title, desc, tags } = req.body;
(후략)
};