서버 액션의 특별한 점 :
"use server";
export async function shareMeal(formData) {
const meal = {
title: formData.get("title"), // input필드의 name속성이 들어온다.
summary: formData.get("summary"),
instructions: formData.get("instructions"),
image: formData.get("image"),
creator: formData.get("name"),
creator_email: formData.get("email"),
};
// console.log(meal); // 서버에 콘솔이 찍힌다.
}
export async function saveMeal(meal) {
meal.slug = slugify(meal.title, { lower: true });
meal.instructions = xss(meal.instructions);
const extension = meal.image.name.split(".").pop();
// 파일 이름이 겹치지 않도록, 랜덤하거나 유니크한 이름을 각각 붙여야한다.
const fileName = `${meal.slug}.${extension}`;
const stream = fs.createWriteStream(`public/images/${fileName}`);
const bufferedImage = await meal.image.arrayBuffer();
stream.write(Buffer.from(bufferedImage), (error) => {
if (error) {
throw new Error("Saving image failed!");
}
});
meal.image = `/images/${fileName}`;
db.prepare(
`
INSERT INTO meals
(title, summary, instructions, creator, creator_email, image, slug)
VALUES (
@title,
@summary,
@instructions,
@creator,
@creator_email,
@image,
@slug
)
`
).run(meal);
}
npm i xss