에러
시작하기
일부 에러 객체에는 .cause
속성이 설정되어 있을 수 있습니다. 대부분의 경우 이는 unknown
형식이며, 값은 추후 예고 없이 변경될 수 있습니다.
일반
SurrealError
SurrealError
는 이 SDK가 명시적으로 던지는 대부분의 에러 객체가 상속하는 기본 클래스입니다. 이 클래스는 JavaScript의 Error
클래스를 상속합니다. 이 에러 객체가 단독으로 던져지는 경우는 거의 없으며, 기본적으로는 상속 클래스의 특별한 의미를 가진 에러 객체가 던져집니다. try-catch
구문 등으로 포착된 에러가 이 SDK가 명시적으로 던진 에러인지 여부를 쉽게 분류하기 위해 사용하는 것을 권장합니다.
속성
.name: "SurrealError"
- 에러 이름입니다.
.message
- 에러 메시지입니다.
.stack
- 스택 트레이스가 기록되어 있을 수 있습니다.
.cause
- 에러가 발생한 원인이나 컨텍스트가 설정될 수 있습니다.
SurrealTypeError
상속원: SurrealError
입력값이나 기타 검증에 실패한 경우 던져지는 에러입니다.
속성
.name: "SurrealTypeError"
- 에러 이름입니다.
.expected
- 예상하는 데이터 형식입니다.
.actual
- 실제 값의 문자열 표현입니다.
해결책
스택 트레이스를 따라 예상하는 데이터 형식이 입력되지 않는 원인을 찾습니다.
SurrealValueError
상속원: SurrealError
입력값이나 기타 검증에 실패한 경우 던져지는 에러입니다.
속성
.name: "SurrealValueError"
- 에러 이름입니다.
.expected
- 예상하는 데이터 형식입니다.
.actual
- 실제 값입니다.
해결책
스택 트레이스를 따라 예상하는 데이터 형식이 입력되지 않는 원인을 찾습니다.
SurrealAggregateError
상속원: SurrealError
여러 에러 또는 에러 메시지가 결합된 에러입니다.
속성
.name: "SurrealAggregateError"
- 에러 이름입니다.
.cause: unknown[]
- 배열의 각 요소에 에러 또는 에러 메시지 등이 포함되어 있습니다.
CircularReferenceError
상속원: SurrealError
순환 참조를 감지한 경우 던져지는 에러입니다. 주로 JavaScript 값을 다른 형식으로 변환하는 과정에서 부모 객체와 동일한 객체가 감지된 경우 던져집니다.
속성
.name: "CircularReferenceError"
- 에러 이름입니다.
.reference: unknown
- 순환 참조가 발생한 값입니다.
예를 들어 다음과 같은 경우에 이 에러가 던져집니다.
import { toSurql } from "@tai-kun/surrealdb/utils";
const a = {};a.a = a;
console.log(a); // <ref *1> { a: [Circular *1] }
toSurql(a); // throws CircularReferenceError
해결책
이 에러는 toSurql
함수 이외에도 던져지는 일반적인 에러입니다. 객체 내부에 해당 객체가 포함되어 있지 않은지 신중하게 디버깅해야 합니다.
NumberRangeError
상속원: SurrealError
숫자가 범위를 벗어난 값을 가진 경우 던져지는 에러입니다.
속성
.name: "NumberRangeError"
- 에러 이름입니다.
.range
- 예상 범위입니다.
.actual
- 실제 값입니다.
.integer
true
인 경우 정수를 예상합니다.
해결책
스택 트레이스를 따라 예상하는 데이터 형식이 입력되지 않는 원인을 찾습니다.
UnsupportedRuntimeError
상속원: SurrealError
지원되지 않는 런타임을 사용하고 있다고 판단된 경우 던져지는 에러입니다.
속성
.name: "UnsupportedRuntimeError"
- 에러 이름입니다.
해결책
해당 런타임을 사용하지 않거나, 폴리필을 사용하여 충분히 테스트해야 합니다.
UnreachableError
상속원: SurrealError
도달할 수 없는 코드에 도달한 경우 던져지는 에러입니다. 이 에러가 던져진 경우, 이 SDK의 버그를 만났을 가능성이 높습니다.
속성
.name: "UnreachableError"
- 에러 이름입니다.
해결책
다음 URL에서 이 문제를 제기할 수 있습니다.
https://github.com/tai-kun/surrealdb.js/issues
클라이언트
CircularEngineReferenceError
상속원: CircularReferenceError
데이터베이스에 연결할 때 엔진 간에 순환 참조가 발생한 경우 던져지는 에러입니다.
속성
.name: "CircularEngineReferenceError"
- 에러 이름입니다.
.reference: string
- 순환 참조가 발생한 스키마 이름입니다.
.seen: string[]
- 순환 참조가 발생하기까지 거친 스키마 이름 목록입니다.
예를 들어 다음과 같은 경우에 이 에러가 던져집니다.
import { initSurreal } from "@tai-kun/surrealdb";
const { Surreal } = initSurreal({ engines: { http: "https", https: "http", }, // ...});
await using db = new Surreal();await db.connect("https://localhost:8000"); // throws CircularEngineReferenceError: Circular engine reference: http,https
위 예시에서는 https 프로토콜 엔진이 http에 설정된 엔진을 사용하려고 하는데, http 프로토콜 엔진은 다시 https에 설정된 엔진을 사용하려고 하기 때문에 순환 참조 에러가 발생합니다.
해결책
문자열로 지정된 프로토콜 이름을 다른 프로토콜 이름의 값으로 설정하지 않고, 대신 엔진을 생성하는 구체적인 구현으로 대체합니다.
import { initSurreal } from "@tai-kun/surrealdb";import HttpEngine from "@tai-kun/surrealdb/http-engine";
const { Surreal } = initSurreal({ engines: { http: "https", http: config => new HttpEngine({ ...config, // fetch: <your custom fetch function> }), https: "http", }, // ...});
EngineNotFoundError
상속원: SurrealError
엔진이 설정되지 않은 프로토콜로 연결하려고 할 때 던져지는 에러입니다.
속성
.name: "EngineNotFoundError"
- 에러 이름입니다.
.scheme: string
- 연결할 프로토콜 이름입니다.
예를 들어 다음과 같은 경우에 이 에러가 던져집니다.
import { initSurreal } from "@tai-kun/surrealdb";
const { Surreal } = initSurreal({ engines: { http: config => new HttpEngine(config), }, // ...});
await using db = new Surreal();await db.connect("https://localhost:8000"); // throws EngineNotFoundError: No https scheme engine found.
해결책
engines
속성에서 연결할 엔드포인트의 프로토콜에 대해 엔진을 생성할 수 있는지 확인합니다.
import { initSurreal } from "@tai-kun/surrealdb";
const { Surreal } = initSurreal({ engines: { http: config => new HttpEngine(config), https: "http", }, // ...});
ConnectionConflictError
상속원: SurrealError
클라이언트가 여러 엔드포인트에 동시에 연결하려고 할 때 던져지는 에러입니다.
속성
.name: "ConnectionConflictError"
- 에러 이름입니다.
.endpoint1: string
- 이미 연결된 엔드포인트입니다.
.endpoint2: string
- 다른 엔드포인트입니다.
import { Surreal } from "@tai-kun/surrealdb";
await using db = new Surreal();
await db.connect("ws://localhost:8000");await db.connect("ws://localhost:1129"); // throws ConnectionConflictError: An attempt was made to connect to ws://localhost:1129/rpc while ws://localhost:8000/rpc was already connected.
.connect
메서드는 전달된 URL의 경로가 /rpc
로 끝나지 않는 경우, 이를 끝에 추가합니다. 따라서 한 엔드포인트의 URL 경로가 /rpc
로 끝나는 경우, 외관상으로는 에러가 발생하지 않을 수 있습니다.
import { Surreal } from "@tai-kun/surrealdb";
await using db = new Surreal();
await db.connect("http://localhost:8000");await db.connect("http://localhost:8000/rpc"); // OK!
import { Surreal } from "@tai-kun/surrealdb";
await using db = new Surreal();
await db.connect("http://localhost:8000/rpc");await db.connect("http://localhost:8000"); // OK!
해결책
.connect
메서드를 호출하기 전에 .close
메서드를 호출하여 임의의 엔드포인트에 연결할 수 있습니다.
import { Surreal } from "@tai-kun/surrealdb";
await using db = new Surreal();
await db.connect("http://localhost:8000");await db.close();await db.connect("http://localhost:11298");
MissingNamespaceError
상속원: SurrealError
데이터베이스를 선택하기 전에 네임스페이스가 선택되지 않은 경우 던져지는 에러입니다. 또는 데이터베이스를 선택한 상태에서 네임스페이스를 선택하지 않은 상태로 만들려고 할 때도 던져집니다.
속성
.name: "MissingNamespaceError"
- 에러 이름입니다.
.database: string
- 데이터베이스 이름입니다.
예를 들어 다음과 같은 경우에 이 에러가 던져집니다.
import { Surreal } from "@tai-kun/surrealdb";
await using db = new Surreal();await db.connect("http://localhost:8000");
await db.use({ database: "example",}); // throws MissingNamespaceError: The namespace must be specified before the database.
해결책
데이터베이스를 선택할 때는 네임스페이스도 함께 선택합니다.
import { Surreal } from "@tai-kun/surrealdb";
await using db = new Surreal();await db.connect("http://localhost:8000");
await db.use({ namespace: "example", database: "example",});
RpcResponseError
상속원: SurrealError
RPC 응답이 에러를 나타내는 경우 던져지는 에러입니다. 연결된 프로토콜을 통한 통신이나 응답 본문의 디코딩에는 문제가 없지만, SurrealDB가 RPC 요청을 처리할 수 없음을 의미합니다.
속성
.name: "RpcResponseError"
- 에러 이름입니다.
.id?: string
- RPC 요청을 식별하는 ID입니다. ID는 항상
<메서드 이름>_
으로 시작합니다. .code: number
- SurrealDB 문서에 명시되어 있지는 않지만, 아마도 JSON-RPC의 에러 코드일 것입니다.
해결책
다양한 원인이 있을 수 있지만, 이 SDK가 지원하는 SurrealDB 버전과 RPC 요청을 처리하는 SurrealDB 버전이 다른 경우일 가능성이 있습니다.
QueryFailedError
상속원: SurrealAggregateError
쿼리에 실패한 경우 던져지는 에러입니다.
속성
.name: "QueryFailedError"
- 에러 이름입니다.
.cause: string[]
- 에러 목록입니다.
예를 들어 다음과 같은 경우에 이 에러가 던져집니다.
await using db = new Surreal();await db.connect("http://localhost:8000");
await db.query("OUTPUT 'Hello'"); // throws QueryFailedError: Query failed with 1 error(s)
해결책
SurrelQL 구문이 올바른지 확인합니다.
Closed
상속원: SurrealError
연결이 강제로 종료되었음을 나타내는 에러입니다.
속성
.name: "Closed"
- 에러 이름입니다.
예를 들어 다음과 같은 경우에 이 에러를 얻습니다.
const db = new Surreal();
db.on("<event_name>", ({ signal }) => { return new Promise((resolve, reject) => { signal.addEventListener("abort", function() { console.error(this.reason); // Closed reject(); })
// ... });});
await db.close({ force: true });
엔진
EngineError
상속원: SurrealError
엔진에 기인한 에러임을 나타냅니다. 이벤트 리스너를 통해 전달됩니다.
속성
.name: "EngineError"
- 에러 이름입니다.
.fatal: boolean | undefined
- 이 에러가 치명적인지 여부를 나타냅니다.
HttpEngineError
상속원: EngineError
HTTP 엔진에 기인한 에러임을 나타냅니다. 현재는 정의만 되어 있으며, 사용되지 않습니다.
속성
.name: "HttpEngineError"
- 에러 이름입니다.
WebSocketEngineError
상속원: EngineError
WebSocket 엔진에 기인한 에러임을 나타냅니다. RPC 요청을 식별하는 ID를 찾기 전에 응답 본문의 파싱에 실패했거나, WebSocket 객체에서 에러 이벤트를 받았을 때, WebSocket 연결을 끊었을 때 등에 사용됩니다.
이 SDK에서는 315x
를 사용자 정의 상태 코드로 사용합니다. 이 범위는 IANA에서는 할당되지 않은 상태 코드입니다.
속성
.name: "WebSocketEngineError"
- 에러 이름입니다.
.code: number
- 다음 상태 코드 중 하나입니다.
1000
~1015
: MDN Reference3150
:WebSocket
[^1] 인스턴스에서 “error” 이벤트를 받았음을 나타냅니다.3151
: WebSocket 엔진이 등록한 “open” 이벤트 핸들러에서 에러가 발생했음을 나타냅니다. 연결 중 상태에서 연결 상태로 전환하는 과정에서StateTransitionError
가 발생했을 가능성이 높습니다.3152
: WebSocket 엔진이 등록한 “message” 이벤트 핸들러에서 에러가 발생했음을 나타냅니다. 다양한 원인이 있을 수 있지만, 이벤트 핸들러에서ServerResponseError
또는RpcResponseError
가 던져졌을 가능성이 높습니다. 잘못된 RPC 매개변수로 요청했을 가능성이 높으며, 이 경우 RPC 호출 메서드는 (기본적으로) 5초 후 타임아웃되어 실패합니다. SurrealDB v2.0.2 이전 버전에서는 더 광범위한 원인으로 타임아웃될 가능성이 있습니다.3153
: ping 송수신에 실패했음을 나타냅니다. 일시적인 에러일 수도 있지만, 지속적으로 발생하는 경우 연결을 유지하지 못하고 있을 가능성이 있습니다.3154
: WebSocket 엔진이 등록한 “close” 이벤트 핸들러에서 에러가 발생했음을 나타냅니다. 연결 해제 중 상태에서 연결 해제 상태로 전환하는 과정에서StateTransitionError
가 발생했을 가능성이 높습니다.
- 다음 상태 코드는 제외합니다. 이 SDK에서는 에러로 처리하지 않습니다.
1000
: 정상적으로 연결이 해제되었습니다.1001
: 조기 연결 해제는 흔히 발생합니다.1004
: 예약됨.1005
: 예약됨.1006
: 예약됨.1015
: 예약됨.
^1: WebSocket
은 런타임이 전역 변수에 정의하는 클래스이거나, ws
의 클래스일 수 있습니다.
해결책
1002
,1003
,1007
…1011
,1014
,3150
,3151
,3154
- 이 상태 코드에서 자동으로 복구하는 방법은 거의 없습니다. 런타임이나 SurrealDB 설정, 하드 코딩된 구현을 수정해야 합니다.
3152
- 메서드에 전달한 인수(즉, RPC 요청 내용)가 올바른지 확인합니다.
1012
,1013
,3153
- 실험적인 기능인
autoReconnect()
를 사용하여 자동으로 복구할 수 있을 것입니다.
StateTransitionError
상속원: SurrealAggregateError
상태 전환 중에 이벤트 리스너의 실행에 실패한 경우 던져지는 에러입니다.
속성
.name: "StateTransitionError"
- 에러 이름입니다.
.from: string
- 상태 전환 시작 시 상태입니다.
.to: string
- 전환할 상태입니다.
.fallback: string
- 상태 전환에 실패한 경우 대체 전환 대상입니다.
.to
와 동일한 값이면 강제로 전환되었음을 의미합니다.
예를 들어 다음과 같은 경우에 이 에러가 던져집니다.
import { Surreal } from "@tai-kun/surrealdb";
await using db = new Surreal();
db.on("connecting", () => { throw new Error("Don't let me connect !!!")});
await db.connect("http://localhost:8000"); // throws ...// StateTransitionError: The transition from `3` to `0` failed, falling back to `3`.// at <stack trace ...> {// cause: [// Error: Don't let me connect !!!// at <stack trace ...>// ],// from: 3,// to: 0,// fallback: 3// }
ConnectionUnavailableError
상속원: SurrealError
연결되지 않은 상태에서 RPC 요청을 보내려고 할 때 던져지는 에러입니다.
속성
.name: "ConnectionUnavailableError"
- 에러 이름입니다.
ServerResponseError
상속원: SurrealError
응답을 PRC 응답으로 파싱할 수 없는 경우 던져지는 에러입니다. RpcResponseError
와는 다릅니다.
속성
.name: "ServerResponseError"
- 에러 이름입니다.
해결책
일반적으로 이 에러가 던져지는 경우는 없어야 하지만, 만약 던져진다면 이 SDK가 지원하는 SurrealDB 버전과 RPC 요청을 처리하는 SurrealDB 버전이 다른 경우일 가능성이 있습니다.
CBOR
CborError
상속원: SurrealError
@tai-kun/surrealdb/cbor
가 명시적으로 던지는 CBOR 관련 모든 에러가 상속하는 클래스입니다. 이것이 직접 던져지는 일은 없습니다.
속성
.name: "CborError"
- 에러 이름입니다.
CborWellFormednessError
상속원: CborError
속성
@tai-kun/surrealdb/cbor
가 명시적으로 던지는 CBOR 디코딩 관련 모든 에러가 상속하는 클래스입니다. 이것이 직접 던져지는 일은 없습니다.
RFC8949 부록 F의 “Well-Formedness Errors and Examples”를 참조하십시오.
.name: "CborWellFormednessError"
- 에러 이름입니다.
CborTooMuchDataError
상속원: CborWellFormednessError
소비되지 않은 입력 바이트가 남아 있음을 나타냅니다.
속성
.name: "CborTooMuchDataError"
- 에러 이름입니다.
해결책
디코딩 대상 바이트 배열이 올바른 CBOR 형식인지 확인합니다.
CborTooLittleDataError
상속원: CborWellFormednessError
입력 바이트가 불완전함을 나타냅니다.
속성
.name: "CborTooLittleDataError"
- 에러 이름입니다.
해결책
디코딩 대상 바이트 배열이 올바른 CBOR 형식인지 확인합니다.
CborSyntaxError
상속원: CborWellFormednessError
입력 바이트가 CBOR 인코딩 형식과 일치하지 않음을 나타냅니다.
속성
.name: "CborSyntaxError"
- 에러 이름입니다.
해결책
디코딩 대상 바이트 배열이 올바른 CBOR 형식인지 확인합니다.
CborMaxDepthReachedError
상속원: CborError
CBOR 인코딩 또는 디코딩 시 JavaScript 객체의 깊이가 최대값에 도달한 경우 던져지는 에러입니다. 객체 또는 배열에 들어갈 때마다 깊이가 1씩 증가합니다.
속성
.name: "CborMaxDepthReachedError"
- 에러 이름입니다.
.maxDepth: number
- 최대 깊이입니다.
해결책
옵션의 .maxDepth
상한을 완화하거나, 객체의 중첩이 얕아지도록 데이터 구조를 재검토합니다.
import CborFormatter from "@tai-kun/surrealdb/cbor-formatter";
const cborFormatter = new CborFormatter({ encode: { maxDepth: 1024, }, decode: { maxDepth: 1024, }, // ...})
CborUnsafeMapKeyError
상속원: CborError
CBOR 인코딩 또는 디코딩 시 안전하지 않은 맵 키가 발견된 경우 던져지는 에러입니다.
속성
.name: "CborUnsafeMapKeyError"
- 에러 이름입니다.
.key: unknown
- 안전하지 않다고 판단된 맵 키입니다.
JSON
JsonError
상속원: SurrealError
@tai-kun/surrealdb/json
이 명시적으로 던지는 JSON-formatter입니다.
속성
.name: "JsonError"
- 에러 이름입니다.
JsonUnsafeMapKeyError
상속원: JsonError
JSON 디코딩 시 안전하지 않은 맵 키가 발견된 경우 던져지는 에러입니다.
속성
.name: "JsonUnsafeMapKeyError"
- 에러 이름입니다.
.key: unknown
- 안전하지 않다고 판단된 맵 키입니다.