저장을 습관화

에러 기록 - SequelizeDatabaseError, sqlMessage: "Unknown column 'postId' in 'field list'" 본문

공부/node.js

에러 기록 - SequelizeDatabaseError, sqlMessage: "Unknown column 'postId' in 'field list'"

ctrs 2023. 6. 29. 00:19

- 증상

게시글 내용 수정 API 작성 중

의도하지 않은 컬럼 'postId'에 접근하여 에러가 발생함

하지만 작성한 코드에는 객체로써 생성한 postId 이외에는 postId에 대한 내용이 들어있지 않은 상태

Executing (default): SELECT `id`, `title`, `content`, `userId`, `likes`, `createdAt`, `updatedAt`, `postId` FROM `Posts` AS `Post` WHERE `Post`.`id` = '1';
node:internal/process/promises:288
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error
    at Query.run (C:(생략)\node_modules\sequelize\lib\dialects\mysql\query.js:52:25)
    at C:(생략)\node_modules\sequelize\lib\sequelize.js:315:28
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async MySQLQueryInterface.select (C:(생략)\node_modules\sequelize\lib\dialects\abstract\query-interface.js:407:12)
    at async Post.findAll (C:(생략)\node_modules\sequelize\lib\model.js:1140:21)
    at async Post.findOne (C:(생략)\node_modules\sequelize\lib\model.js:1240:12)
    at async C:(생략)\routes\posts.js:93:16 {
  name: 'SequelizeDatabaseError',
  parent: Error: Unknown column 'postId' in 'field list'
      at Packet.asError (C:(생략)\node_modules\mysql2\lib\packets\packet.js:728:17)
      at Query.execute (C:(생략)\node_modules\mysql2\lib\commands\command.js:29:26)
      at Connection.handlePacket (C:(생략)\node_modules\mysql2\lib\connection.js:492:32)
      at PacketParser.onPacket (C:(생략)\node_modules\mysql2\lib\connection.js:97:12)
      at PacketParser.executeStart (C:(생략)\node_modules\mysql2\lib\packet_parser.js:75:16)
      at Socket.<anonymous> (C:(생략)\node_modules\mysql2\lib\connection.js:104:25)
      at Socket.emit (node:events:513:28)
      at addChunk (node:internal/streams/readable:324:12)
      at readableAddChunk (node:internal/streams/readable:297:9)
      at Readable.push (node:internal/streams/readable:234:10) {
    code: 'ER_BAD_FIELD_ERROR',
    errno: 1054,
    sqlState: '42S22',
    sqlMessage: "Unknown column 'postId' in 'field list'",
    sql: "SELECT `id`, `title`, `content`, `userId`, `likes`, `createdAt`, `updatedAt`, `postId` FROM `Posts` AS `Post` WHERE `Post`.`id` = 
'1';",
    parameters: undefined
  },
  original: Error: Unknown column 'postId' in 'field list'
      at Packet.asError (C:(생략)\node_modules\mysql2\lib\packets\packet.js:728:17)
      at Query.execute (C:(생략)\node_modules\mysql2\lib\commands\command.js:29:26)
      at Connection.handlePacket (C:(생략)\node_modules\mysql2\lib\connection.js:492:32)
      at PacketParser.onPacket (C:(생략)\node_modules\mysql2\lib\connection.js:97:12)
      at PacketParser.executeStart (C:(생략)\node_modules\mysql2\lib\packet_parser.js:75:16)
      at Socket.<anonymous> (C:(생략)\node_modules\mysql2\lib\connection.js:104:25)
      at Socket.emit (node:events:513:28)
      at addChunk (node:internal/streams/readable:324:12)
      at readableAddChunk (node:internal/streams/readable:297:9)
      at Readable.push (node:internal/streams/readable:234:10) {
    code: 'ER_BAD_FIELD_ERROR',
    errno: 1054,
    sqlState: '42S22',
    sqlMessage: "Unknown column 'postId' in 'field list'",
    sql: "SELECT `id`, `title`, `content`, `userId`, `likes`, `createdAt`, `updatedAt`, `postId` FROM `Posts` AS `Post` WHERE `Post`.`id` = '1';",
    parameters: undefined
  },
  sql: "SELECT `id`, `title`, `content`, `userId`, `likes`, `createdAt`, `updatedAt`, `postId` FROM `Posts` AS `Post` WHERE `Post`.`id` = '1';",
  parameters: {}
}

Node.js v18.16.0
[nodemon] app crashed - waiting for file changes before starting...

 

 

- 원인

아직 파악하지 못했음

 

 

- 해결 방법

attibutes를 작성하여 접근한 컬럼을 지정해 줬음

router.put('/:postId', async (req, res) => {
  const { postId } = req.params;
  const { title, content } = req.body;

  const post = await Post.findOne({
    where: { id: postId },
    attributes: ['id', 'title', 'content', 'createdAt', 'userId', 'likes'],
  });

  ...(중략)

  try {
    await Post.update(
      { title, content }, // 수정할 컬럼 및 데이터
      {
        where: { id: postId }, 
        attributes: ['id', 'title', 'content', 'createdAt', 'userId', 'likes'],
      }
    );

    return res.status(200).json({ message: '게시글이 수정되었습니다.' });
  } catch (error) {
    return res
      .status(400)
      .json({ errorMEssage: '게시글 수정에 실패하였습니다.' });
  }
});