강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

maliethy님의 프로필 이미지
maliethy

작성한 질문수

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

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

해결된 질문

작성

·

559

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);
    }
});

답변 2

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

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

0

maliethy님의 프로필 이미지
maliethy
질문자

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

maliethy님의 프로필 이미지
maliethy

작성한 질문수

질문하기