inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] React로 NodeBird SNS 만들기

SequelizeUniqueConstraintError) Duplicate entry '1-2' for key 'follow.PRIMARY' 문제입니다

해결된 질문

596

maliethy

작성한 질문수 9

0

팔로우 기능 구현 중에  follow.PRIMARY에 문제가 있다는 에러가 생겼습니다

mysql table을 보면 FollowingId, FollowerId값은 잘 들어가져 있고,

redux에는 FOLLOW_SUCCESS까지  나타납니다

그런데 FOLLOW_SUCCESS뒤에 FOLLOW_FAILURE가 나오면서 아래와 같은 'follow.PRIMARY must be unique' 에러가 백앤드 서버에서 발생합니다. 더블클릭을 하지 않았는데도 두번 요청이 들어가는 건가요? 어떻게 해결해야하는지 모르겠습니다 도와주세요 제로초님~

PATCH /user/1/follow 200 176.212 ms - 12

UniqueConstraintError [SequelizeUniqueConstraintError]: Validation error

    at Query.formatError (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\dialects\mysql\query.js:218:16)   

    at Query.run (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\dialects\mysql\query.js:54:18)

    at processTicksAndRejections (internal/process/task_queues.js:93:5)

    at async C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\sequelize.js:619:16

    at async MySQLQueryInterface.bulkInsert (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\dialects\abstract\query-interface.js:818:21)

    at async recursiveBulkCreate (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\model.js:2698:25)

    at async Function.bulkCreate (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\model.js:2824:12)

    at async Promise.all (index 0)

    at async BelongsToMany.add (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\associations\belongs-to-many.js:740:30)

    at async C:\Users\HOME\Documents\ymillonga\back\routes\user.js:168:9 {

  errors: [

    ValidationErrorItem {

      message: 'follow.PRIMARY must be unique',

      type: 'unique violation',

      path: 'follow.PRIMARY',

      value: '1-2',

      origin: 'DB',

      instance: null,

      validatorKey: 'not_unique',

      validatorName: null,

      validatorArgs: []

    }

  ],

  fields: { 'follow.PRIMARY': '1-2' },

  parent: Error: Duplicate entry '1-2' for key 'follow.PRIMARY'      at Packet.asError (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\packets\packet.js:712:17)

      at Query.execute (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\commands\command.js:28:26)

      at Connection.handlePacket (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\connection.js:425:32)        

      at PacketParser.onPacket (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\connection.js:75:12)

      at PacketParser.executeStart (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\packet_parser.js:75:16)    

      at Socket.<anonymous> (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\connection.js:82:25)

      at Socket.emit (events.js:314:20)

      at addChunk (_stream_readable.js:303:12)

      at readableAddChunk (_stream_readable.js:279:9)

      at Socket.Readable.push (_stream_readable.js:218:10) {   

    code: 'ER_DUP_ENTRY',

    errno: 1062,

    sqlState: '23000',

    sqlMessage: "Duplicate entry '1-2' for key 'follow.PRIMARY'",

    sql: "INSERT INTO `Follow` (`createdAt`,`updatedAt`,`FollowingId`,`FollowerId`) VALUES ('2020-11-29 10:47:14','2020-11-29 

10:47:14',1,2);",

    parameters: undefined

  },

  original: Error: Duplicate entry '1-2' for key 'follow.PRIMARY'

      at Packet.asError (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\packets\packet.js:712:17)

      at Query.execute (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\commands\command.js:28:26)

      at Connection.handlePacket (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\connection.js:425:32)        

      at PacketParser.onPacket (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\connection.js:75:12)

      at PacketParser.executeStart (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\packet_parser.js:75:16)    

      at Socket.<anonymous> (C:\Users\HOME\Documents\ymillonga\back\node_modules\mysql2\lib\connection.js:82:25)

      at Socket.emit (events.js:314:20)

      at addChunk (_stream_readable.js:303:12)

      at readableAddChunk (_stream_readable.js:279:9)

      at Socket.Readable.push (_stream_readable.js:218:10) {   

    code: 'ER_DUP_ENTRY',

    errno: 1062,

    sqlState: '23000',

    sqlMessage: "Duplicate entry '1-2' for key 'follow.PRIMARY'",

    sql: "INSERT INTO `Follow` (`createdAt`,`updatedAt`,`FollowingId`,`FollowerId`) VALUES ('2020-11-29 10:47:14','2020-11-29 

10:47:14',1,2);",

    parameters: undefined

  },

  sql: "INSERT INTO `Follow` (`createdAt`,`updatedAt`,`FollowingId`,`FollowerId`) VALUES ('2020-11-29 10:47:14','2020-11-29 10:47:14',1,2);"

}

SequelizeUniqueConstraintError: Validation error

    at Query.formatError (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\dialects\mysql\query.js:218:16)   

    at Query.run (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\dialects\mysql\query.js:54:18)

    at processTicksAndRejections (internal/process/task_queues.js:93:5)

    at async C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\sequelize.js:619:16

    at async MySQLQueryInterface.bulkInsert (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\dialects\abstract\query-interface.js:818:21)

    at async recursiveBulkCreate (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\model.js:2698:25)

    at async Function.bulkCreate (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\model.js:2824:12)

    at async Promise.all (index 0)

    at async BelongsToMany.add (C:\Users\HOME\Documents\ymillonga\back\node_modules\sequelize\lib\associations\belongs-to-many.js:740:30)

    at async C:\Users\HOME\Documents\ymillonga\back\routes\user.js:168:9

PATCH /user/1/follow 500 387.485 ms - 1353

back/models/user.js

const DataTypes = require('sequelize');
const { Model } = DataTypes;
module.exports = class User extends Model {
    static init(sequelize) {
        return super.init({
            email: {
                type: DataTypes.STRING(30),
                allowNull: false,//필수값으로 설정
                unique: true,
            },
            nickname: {
                type: DataTypes.STRING(30),
                allowNull: false,
            },
            password: {
                type: DataTypes.STRING(100),
                allowNull: false,
            },
            snsId: {
                type: DataTypes.STRING(30),
                allowNull: true,
            },
            provider: {
                type: DataTypes.STRING(10),
                allowNull: false,
                defaultValue: 'local',
            },
        },
            {
                modelName: 'User',
                tableName: 'users',
                charset: 'utf8',
                collate: 'utf8_general_ci',
                sequelize,
            });
    }
    static associate(db) {
        db.User.hasMany(db.Post);
        db.User.hasMany(db.Comment);
        db.User.belongsToMany(db.Post, { through: 'Like'as: 'Likers' }); //중간 테이블 이름: Like, 별칭:'Likers;
        db.User.belongsToMany(db.User, { through: 'Follow'as: 'Followers'foreignKey: 'FollowingId' });//foreignKey:col의 값을 정해준다//나=FollowingId, 내가 따라다니는 사람목록=Followers 
        db.User.belongsToMany(db.User, { through: 'Follow'as: 'Followings'foreignKey: 'FollowerId' });//나=FollowerId
    }
};

/back/routes/user.js

router.patch('/:userId/follow'isLoggedInasync (reqresnext=> {
    try {
        const user = await User.findOne({
            where: { id: req.params.userId }
        });
        if (!user) {
            res.status(403).send('존재하지 않는 사용자는 팔로잉할 수 없습니다.');
        }
        await user.addFollowers(req.user.id);//게시글 작성자를 따라다니는 followers목록에 나를 추가
        res.status(200).json({ UserId: parseInt(req.params.userId10) });
    }
    catch (err) {
        console.error(err);
        next(err);
    }
});

redux nodejs react express Next.js

답변 2

1

제로초(조현영)

Follow 요청이 두 번 가고있네요. 네트워크 탭에서 요청이 두 번 가는지 실제로 확인해보세요. 그리고 user.js에 acton 오타도 있는 것 같습니다.

0

maliethy

제가 saga에서 follow를 두번 fork하고 있었네요ㅜㅠ. 항상 친절한 답변 감사합니다~

넥스트 버젼 질문

0

75

2

로그인시 401 Unauthorized 오류가 뜹니다

0

88

1

무한 스크롤 중 스크롤 튐 현상

0

172

1

특정 페이지 접근을 막고 싶을 때

0

103

2

createGlobalStyle의 위치와 영향범위

0

93

2

인라인 스타일 리렌더링 관련

0

90

2

vsc 에서 npm init 설치시 오류

0

146

2

nextjs 15버전 사용 가능할까요?

0

157

1

화면 새로고침 문의

0

119

1

RTK에서 draft, state 차이가 있나요?

0

151

2

Next 14 사용해도 될까요?

0

452

1

next, node 버전 / 폴더 구조 질문 드립니다.

0

348

1

url 오류 질문있습니다

0

210

1

ssh xxxxx로 우분투에 들어가려니까 port 22: Connection timed out

0

372

1

sudo certbot --nginx 에러

0

1271

2

Minified React error 콘솔에러 (hydrate)

0

467

1

카카오 공유했을 때 이전에 작성했던 글이 나오는 버그

0

245

1

프론트서버 배포 후 EADDRINUSE에러 발생

0

325

1

npm run build 에러

0

517

1

front 서버 npm run build 중에 발생한 에러들

0

381

1

서버 실행하고 브라우저로 들어갔을때 404에러

0

335

2

css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.

0

283

1

팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.

0

235

2

해시태그 검색에서 throttle에 관해 질문있습니다.

0

198

1