pages 폴더 내부의 api 폴더 이름은 반드시 api 여야 한다. NextJS 가 이를 인식하여 동작함.
// pages/index.js
import { useRef, useState } from "react";
function HomePage() {
const [feedbackItems, setFeedbackItems] = useState([]);
const emailInputRef = useRef();
const feedbackInputRef = useRef();
function submitFormHandler(event) {
event.preventDefault();
const enteredEmail = emailInputRef.current.value;
const enteredFeedback = feedbackInputRef.current.value;
const reqBody = {
email: enteredEmail,
text: enteredFeedback,
};
fetch("/api/feedback", {
method: "POST",
body: JSON.stringify(reqBody),
headers: {
"Content-Type": "application/json",
},
})
.then((res) => res.json())
.then((data) => console.log(data));
}
function loadFeedbackHandler() {
fetch("/api/feedback")
.then((res) => res.json())
.then((data) => setFeedbackItems(data.feedback));
}
return (
<div>
<h1>The Home Page</h1>
<form onSubmit={submitFormHandler}>
<div>
<label htmlFor="email">Your Email Address</label>
<input type="email" id="email" ref={emailInputRef} />
</div>
<div>
<label htmlFor="feedback">Your Feedback</label>
<textarea id="feedback" rows="5" ref={feedbackInputRef}></textarea>
</div>
<button>Send Feedback</button>
</form>
<hr />
<button onClick={loadFeedbackHandler}>Load Feedback</button>
<ul>
{feedbackItems.map((item) => (
<li key={item.id}>{item.text}</li>
))}
</ul>
</div>
);
}
export default HomePage;
// pages/api/feedback.js
import fs from "fs";
import path from "path";
function buildFeedbackPath() {
return path.join(process.cwd(), "data", "feedback.json");
}
function extractFeedback(filePath) {
const fileData = fs.readFileSync(filePath);
const data = JSON.parse(fileData);
return data;
}
function handler(req, res) {
if (req.method === "POST") {
const email = req.body.email;
const feedbackText = req.body.text;
const newFeedback = {
id: new Date().toISOString(),
email: email,
text: feedbackText,
};
const filePath = buildFeedbackPath();
const data = extractFeedback(filePath);
data.push(newFeedback);
fs.writeFileSync(filePath, JSON.stringify(data));
res.status(201).json({
message: "Success!",
feedback: newFeedback,
});
} else {
const filePath = buildFeedbackPath();
const data = extractFeedback(filePath);
res.status(200).json({
feedback: data,
});
}
}
export default handler;