해쉬테그
전에 컴포넌트를 구성할때 정규표현식으로 해쉬태그를 배열로 추출했습니다.
이번에도 정규표현식을 이용해줄 것입니다 .
저번시간에 작성한 게시글 작성 라우터를 다시 수정해주어야 겠네요.
해쉬태그 추출
먼저 보내진 글에서 해쉬태그를 정규표현식을 이용해 추출해줍니다.
//게시글 등록 POST /post
router.post("/", isLoggedIn, upload.none(), async (req, res, next) => {
try {
//해쉬태그 추출
const hashtags = req.body.content.match(/#[^\s#]+/g);
const post = await Post.create({
content: req.body.content,
UserId: req.user.id,
});
if (req.body.image) {
if (Array.isArray(req.body.image)) {
const images = await Promise.all(
req.body.image.map((image) => Image.create({ src: image }))
);
await post.addImages(images);
} else {
const image = await Image.create({ src: req.body.image });
await post.addImages(image);
}
}
const fullPost = await Post.findOne({
where: { id: post.id },
include: [
{ model: Image },
{ model: Comment },
{ model: User, attributes: ["id", "nickname"] },
{ model: User, as: "Likers", attributes: ["id"] },
],
});
res.status(201).json(fullPost);
} catch (e) {
console.error(e);
next(e);
}
});
해쉬태그가 있다면 해쉬태그를 hashtags태이블에 저장
그걸 구성하는 코드는 다음과 같습니다.
if (hashtags) {
const result = await Promise.all(
hashtags.map((tag) =>
Hashtag.findOrCreate({
//있으면 등록 없으면 등록 X
where: { name: tag.slice(1).toLowerCase() }, //slice로 #때준다.
})
)
); // [[노드, true], [리액트, true]]
await post.addHashtags(result.map((v) => v[0]));
}
findOrCreate는 태이블안에 이름이 같은 해쉬태그가 있다면 저장하지 않기 위해 사용하는 Sequelize매소드입니다.
게시글 업로드 완성코드
//게시글 등록 POST /post
router.post("/", isLoggedIn, upload.none(), async (req, res, next) => {
try {
//해쉬태그 추출
const hashtags = req.body.content.match(/#[^\s#]+/g);
const post = await Post.create({
content: req.body.content,
UserId: req.user.id,
});
//해쉬태그가 있다면
if (hashtags) {
const result = await Promise.all(
hashtags.map((tag) =>
Hashtag.findOrCreate({
//있으면 등록 없으면 등록 X
where: { name: tag.slice(1).toLowerCase() }, //slice로 #때준다.
})
)
); // [[노드, true], [리액트, true]]
await post.addHashtags(result.map((v) => v[0]));
}
if (req.body.image) {
if (Array.isArray(req.body.image)) {
const images = await Promise.all(
req.body.image.map((image) => Image.create({ src: image }))
);
await post.addImages(images);
} else {
const image = await Image.create({ src: req.body.image });
await post.addImages(image);
}
}
const fullPost = await Post.findOne({
where: { id: post.id },
include: [
{ model: Image },
{ model: Comment },
{ model: User, attributes: ["id", "nickname"] },
{ model: User, as: "Likers", attributes: ["id"] },
],
});
res.status(201).json(fullPost);
} catch (e) {
console.error(e);
next(e);
}
});
Last updated