Project/codestates-final-project

10일차 / n : m 연결 고민 미완이라 내일도 할 예정

fullfish 2022. 5. 3. 01:15

원래 diary post 코드

 try {
      const { title, picture, gps, content, write_date, hashtags } = req.body;
      if (!title || !picture || !content || !write_date) {
        await slack.slack("Diary Post 422");
        return res.status(422).send({ message: "insufficient parameters supplied" });
      }
      const validity = await tokenHandler.accessTokenVerify(req, res);
      if (validity) {
        //해쉬태그 제외한 다이어리 추가
        const diaryPayload = {
          trip_id: req.params.trip_id,
          title,
          picture,
          gps,
          content,
          write_date,
        };
        const diaryInfo = await diary.create(diaryPayload);
        // 해쉬태그 추가 // map같은거 배열로 오는 해쉬태그를 하나하나추가 / 해쉬태그 중복여부
        hashtags.map(async (ele) => {
          const data = await hashtag.findOne({
            where: {
              hashtag: ele,
            },
          });
          let hashtagInfo = data;
          //해쉬태그가 이미 있는게 아닐경우 (없을 경우)
          if (!data) {
            const hashtagPayload = {
              hashtag: ele,
            };
            hashtagInfo = await hashtag.create(hashtagPayload);
            await slack.slack("Hashtag Post 201", `id : ${hashtagInfo.id}`);
          }
          //조인테이블 추가
          const diary_hashtagPayload = {
            diary_id: diaryInfo.dataValues.id,
            hashtag_id: hashtagInfo.dataValues.id,
          };
          await diary_hashtag.create(diary_hashtagPayload);
        });
        await slack.slack("Diary Post 201", `id : ${diaryInfo.id}`);
        res.status(201).send({ data: { id: diaryInfo.id }, accessToken: validity.accessToken });
      }
    } catch (err) {
      await slack.slack("Diary Post 501");
      res.status(501).send("Diary Post");
    }

원래는 다이어리추가

해쉬태그 추가

다이어리_해쉬태그 조인테이블추가를 각각 해줬다

그런데 user 삭제시

trip, diary, diary_hashtag 까지만 지워지고 hashtag는 안지워진다

diary_hashtag내에서 hashtag id값을 갖는게 하나도 없으면 hashtag 테이블에서 그 값이 지워져야한다고 생각했기때문에

관계설정이 잘 안됐나하고 찾다가

create할때 위의 코드처럼 각각 추가하지않고

 

   const diaryInfo = await diary.create(
      {
        title: "제목",
        trip_id: 1,
        hashtags: [{ hashtag: "tag1" }, { hashtag: "tag2" }], //테이블이 단수여도 s붙여야함
      },
      {
        include: hashtag,
      }
    );
    const result = await diary.findOne({
      where: { title: "제목" },
      include: hashtag,
    });

이런식으로 써주면

diary 테이블의 title로 제목, trip_id로 1이 생성되고

hashtag 테이블에는 tag1과 tag2가 생긴다

그리고 조인테이블도 정상적으로 생기지만

user 삭제시 여전히 hashtag는 안지워지는거로 보아

따로 삭제를 해줘야할것같다 (용량 확보위해)

항상 하기에는 너무 계산낭비일거같고 스케쥴러 등록해서 주기적으로 하면 좋을거 같다

 

오늘 해결 못한점이 

const aa = await hashtags.map(async (ele) => {
  const data = await hashtag.findOne({
    where: {
      hashtag: ele,
    },
  });
  return ele 
});
console.log(aa);

hashtag 테이블에 없는값만 추가해주기 위해서 각각의 요소들이 db에 있는지 검증하기위해 코드를 짜던중에

위 코드와 같은 경우에 hashtags = [1,2,3] 이면 [1,2,3]이 출력되야할거 같지만

[ Promise { <pending> }, Promise { <pending> }, Promise { <pending> } ]

이 출력된다

[1,2,3]이 출력된다면 map과 filter를 써서 

[{ hashtag: "1" }, { hashtag: "2" }, {hashtag: "3"}]

처럼 출력하려고 했다

나머지는 내일로...