• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

해시태그 검색관련 질문있습니다.

24.03.06 01:35 작성 조회수 98

0

자주 질문을 드려 죄송합니다. ㅠㅠ 모르는게 많아서 ㅠㅠ

그 해시태그 부분을 작업 하고 있는데 제가 해시태그를 클릭하게 되면 예를 들러 123123을 클릭을 한다 라고 하면

기존 아래에서

 

검색이 될시

이런식으로 해시태그가 123123만 나오고 나머지 것들은 안나오는 현상이 나오고 있습니다.

코드 같은 경우는 알려주신데로

router.get("/:hashtag", async (req, res, next) => {
    try {
        const users = req.user ? req.user.id : null;
        const offset = (parseInt(req.query.page) - 1) * 10 || 0
        const {
            count,
            rows: post
        } = await Post.findAndCountAll({
            offset: offset,
            limit: 10,

            // DESC 최신순 ASC 오래된순
            order: [
                ["createdAt", "DESC"]
            ],

            include: [
            {
                model: Hashtag,
                where: {
                    hashtag: req.params.hashtag
                },
                attributes: ["hashtag"],
                through: {
                    attributes: [] 
                },
            }, {
                model: Image,
                attributes: ["src"],
            },{
                model: User,
                attributes: ["nickName"],
            }],
            
            attributes: [
                "id",
                "title",
                "createdAt",
                "view",
                "content",
                // 좋아요 수
                [Sequelize.literal("(SELECT COUNT(*) FROM `Like` WHERE `Like`.`postId` = `Post`.`id`)"), "count"],
                // 좋아요 여부
                [Sequelize.literal("IF((SELECT `postId` FROM `Like` WHERE `Like`.`postId` = `Post`.`id` AND `Like`.`userId` = " + users + "), 1, 0)"), "like"],
            ],
        })
        const posts = post.map((post) => {
            const format = post.toJSON()
            format.hashtag = format.Hashtags.map((tag)=>tag.hashtag)
            format.src = format.Images.map((img) => img.src).join("")
            format.nickname = format.User.nickName
            format.content = format.content.replace(/<[^>]+>|<img.*?>/g, "");
            delete format.Images;
            delete format.User;
            delete format.Hashtags;
            return format;
        })

        res.status(201).json({
            count,
            posts
        })
    } catch (error) {
        console.error(error)
        next(error)
    }
})

이렇게 작성을 하였는데 찾아 보니
where: { hashtag: req.params.hashtag },
이렇게 작성을 하게 되면 해당 해시태그에 해당하는 게시물이 불러와 지기는 하는데 검색된 해시태그만 뽑아서 나타나지게 되니

 

where: {
   hashtag: {
      [Op.contains]: [`${req.params.hashtag}`]
     }
},

이런식으로 작성을 하면 된다고 해서 써봣는데


"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''asd' LEFT OUTER JOIN Images AS Images ON Post.`id` = Images.`PostId` LE' at line 1",

sql: "SELECT count(`Post`.`id`) AS count FROM Posts AS Post INNER JOIN ( PostHashtag AS Hashtags->PostHashtag INNER JOIN Hashtags AS Hashtags ON Hashtags.`id` = Hashtags->PostHashtag.`HashtagId`) ON Post.`id` = Hashtags->PostHashtag.`PostId` AND Hashtags.`hashtag` <@ 'asd' LEFT OUTER JOIN Images AS Images ON Post.`id` = Images.`PostId` LEFT OUTER JOIN Users AS User ON Post.`UserId` = User.`id`;",

이런 에러가 나더라구요... 왜 images에 관련된 문구가 나오는지는 모르겟지만.... 혹시 mysql에서 contains메소드가 사라진건지 아닌지 혹시 고칠수 잇는건지 궁금합니다.

제 sequelize 버전은 6.35.2 입니다. ㅠㅠ

 


답변 1

답변을 작성해보세요.

0

required: false,

where: {

hashtag: req.params.hashtag,

},

해보세요. required: false 추가해보세요.

GI P님의 프로필

GI P

질문자

2024.03.06

required false 이 나타나는게 Op.contains처럼 입력한 해시태그를 포함한 나머지를ㅈ나타내는 뜻일까요?