NodeJS

[ERR_ASSERTION]: Missing where attribute in the options parameter 해결

JavaScript ORM 라이브러리인 Sequelize를 사용하면서 아래와 같은 에러가 발생하는 경우가 있습니다.

node:internal/process/promises:246
          triggerUncaughtException(err, true /* fromPromise */);
          ^

AssertionError [ERR_ASSERTION]: Missing where attribute in the options parameter
    at Function._optionsMustContainWhere (C:\Source\MyProject\node_modules\sequelize\lib\model.js:2070:5)
    at Function.update (C:\Source\MyProject\node_modules\sequelize\lib\model.js:1836:10)
    at model.Users.resetAllPoints(file:///C:/Source/MyProject/server/models/Users.js:61:82)
    at Job.job (file:///C:/Source/MyProject/server/middlewares/users.js:59:34)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
Emitted 'error' event on Job instance at:
    at C:\Source\MyProject\node_modules\node-schedule\lib\Invocation.js:277:17
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
 {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: undefined,
  expected: true,
  operator: '=='
}

위 에러 로그에서 확인할 수 있는 문제는 AssertionError [ERR_ASSERTION]: Missing where attribute in the options parameter인데, 이는 요청 트랜잭션에서 누락된 쿼리문이 있어서 발생하는 문제입니다.

해결 방법

이 문제는 주로 데이터베이스 UPDATE문을 사용할 때 모든 행에 적용하기 위해 특별한 WHERE 조건 없이 메소드를 호출했을 경우 발생합니다. 예를 들면 아래와 같습니다.

Users.prototype.resetAllPoints = () => Users.update({
  point: 0
});

resetAllPoints가 호출되면 모든 사용자의 pointUPDATE문으로 인해 0으로 초기화됩니다. 하지만 이렇게 하면 에러가 발생합니다. 아무래도 sequelize 라이브러리에서 WHERE문 없는 UPDATE문은 위험한 쿼리라고 판단해서 의도적으로 에러를 리턴하도록 설계했을 수 있습니다.

모든 행에 적용하면서도 위와 같은 문제를 해결하려면 모든 행을 가리키는 임의의 WHERE문을 추가하는 방법으로 해결할 수 있습니다. 위 예시에서는 id 열의 모든 값(0 이상의 값)을 선택하도록 지정해주었습니다. 데이터베이스 환경에 따라 컬럼명이나 값들이 다를 수 있으므로 범위를 확인한 후 작성해야 합니다.

Users.prototype.resetAllPoints = () => Users.update({
  point: 0
}, {
  where: {
    id: { [Op.gte]: 0 }
  }
});

이렇게하면 더 이상 에러가 발생하지 않을 것입니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

Recent Posts

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

1개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

1개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

1개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

1개월 ago

윈도우 11 설치 시 Microsoft 계정 로그인 없이 로컬 계정 만들기

언제부턴가 윈도우 11을 처음 설치할 때 마이크로소프트(Microsoft) 계정 로그인을 강제로 요구하게 되었습니다. 물론 마이크로소프트 계정이…

7개월 ago

에어팟 프로 2 케이스 스피커 소리를 완전히 끄는 방법

애플 에어팟 프로 2 (AirPods Pro 2) 케이스에는 스피커가 내장되어 있습니다. 그런데 간혹 아무 것도…

9개월 ago