이전 블로그에서 자바스크립트에서 N1QL을 실행하는 방법에 대해 살펴봤습니다. 함수문서 처리 반복기를 통해및 데이터 조작.
이제 N1QL 문의 오류 처리로 넘어가겠습니다.
오류 처리
어떤 성격의 오류가 발생하면 jsevaluator 는 기본적으로 함수 실행을 중지하고 오류를 반환합니다:
이 특별한 경우에는 두 번째 INSERT가 실패합니다. k10 이미 존재합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[ { "code": 10109, "msg": "'doInsert' 함수 실행 중 오류 발생(n1ql:doInsert)", "reason": { "세부 정보": { "코드": " var q2 = N1QL('b1 값에 삽입(\\\"k10\\\", {\\\"f1\\\": 10});', {}, true);", "예외": { "발신자": "couchbase:2088", "원인": { "발신자": "카우치베이스:1961", "code": 17012, "key": "dml.statement.duplicatekey", "메시지": "중복 키: k10" }, "code": 12009, "원인": "중복 키: k10", "key": "datastore.couchbase.DML_error", "메시지": "DML 오류, 가능한 원인으로는 동시 수정이 있습니다. 키 k10에서 INSERT를 수행하지 못했습니다.", "다시 시도": false }, "위치": "functions/n1ql.js:21", "스택": "(functions/n1ql.js:3:14)에서 삽입(doInsert)" }, "type": "JS 코드의 예외" } } ] |
기본 동작을 고수할 필요 없이 JavaScript를 통해 오류를 포착하고 처리할 수 있습니다:
이 경우 함수 doInsert() 반환 실패 왜냐하면 키 k10 이미 존재합니다.
반환 대 던지기
그리고 catch 블록을 사용하여 비즈니스 로직에 유용한 방식으로 장애를 처리할 수 있습니다.
사용 가능한 옵션은 1) 회피 조치를 취하고 실행을 계속하거나, 2) 성공 시 조기 복귀하거나, 3) 실패 시 조기 복귀하는 것으로 요약됩니다.
성공과 실패의 차이는 단순히 반환 를 사용하여 위의 예제에서와 같이 값을 반환하는 것과 throw 를 클릭하여 오류를 반환합니다.
이 둘의 차이점은 다음과 같은 이유로 중요합니다. 결과를 반환하도록 선택하면 호출자 요청이 계속 실행됩니다. 오류를 발생시키면 전체 요청이 오류와 함께 실패하게 되므로 요청이 올바르게 작동하는 것과 오작동하는 것의 차이를 만들 수 있으므로 어떤 것을 사용할지 신중하게 생각해야 합니다.
반환된 표현식
두 번째로 염두에 두어야 할 것은 반환하거나 오류를 던질 때 의미 있는 정보를 제공해야 한다는 것입니다.
다음 코드를 고려하세요:
다음과 같은 경우 실패합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[ { "code": 10109, "msg": "'doInsert' 함수 실행 중 오류 발생(n1ql:doInsert)", "reason": { "세부 정보": { "코드": " throw err;", "예외": { "발신자": "couchbase:2088", "원인": { "발신자": "카우치베이스:1961", "code": 17012, "key": "dml.statement.duplicatekey", "메시지": "중복 키: k10" }, "code": 12009, "원인": "중복 키: k10", "key": "datastore.couchbase.DML_error", "메시지": "DML 오류, 가능한 원인으로는 동시 수정이 있습니다. 키 k10에서 INSERT를 수행하지 못했습니다.", "다시 시도": false }, "위치": "functions/n1ql.js:6", "스택": "(functions/n1ql.js:3:17)에서"" }, "type": "JS 코드의 예외" } } ] |
앞의 예시와 마찬가지로, 여기서 얻을 수 있는 결론은 다음과 같습니다. err 는 객체이며 이유 필드에 입력합니다.
그러나 throw 문과 같이 작성합니다:
그리고 doInsert() 함수는 이제 객체가 아닌 문자열을 반환합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ { "code": 10109, "msg": "'doInsert' 함수 실행 중 오류 발생(n1ql:doInsert)", "reason": { "세부 정보": { "코드": " throw \"failure\" + err;", "예외": "failure {\"caller\":\"couchbase:2088\",\"cause\":{\"caller\":\"couchbase:1961\",\"code\":17012,\"key\":\"dml.statement.duplicatekey\",\"message\":\"중복 키: k10\"},\"code\":12009,\"icause\":\"중복 키: k10\",\"key\":\"datastore.couchbase.DML_error\",\"message\":\"DML 오류, 가능한 원인으로는 동시 수정이 있습니다. 키 k10에 INSERT를 수행하지 못했습니다\",\"retry\":false}", "위치": "functions/n1ql.js:6" }, "type": "JS 코드의 예외" } } ] |
그리고 err 객체를 문자열로 마샬링하면 갑자기 오류를 읽을 수 없게 됩니다.
이는 다음에 적용됩니다. 반환 너무: 특히 기본적으로 err 에는 마샬링된 JSON 객체가 포함된 문자열이 포함됩니다.
예를 들어
반환합니다:
1 2 3 4 5 6 |
[ { "메시지": "{\"caller\":\"couchbase:2088\",\"cause\":{\"caller\":\"couchbase:1961\",\"code\":17012,\"key\":\"dml.statement.duplicatekey\",\"message\":\"중복 키: k10\"},\"code\":12009,\"icause\":\"중복 키: k10\",\"key\":\"datastore.couchbase.DML_error\",\"message\":\"DML 오류, 가능한 원인으로는 동시 수정이 있습니다. 키 k10에 INSERT를 수행하지 못했습니다\",\"retry\":false}", "stack": "doInsert에서 오류\n(functions/n1ql.js:3:17)" } ] |
멋진 반환값을 얻으려면, 반환값을 구문 분석해야 합니다. error.message 객체를 반환합니다:
어떤 결과가 나옵니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[ { "발신자": "couchbase:2088", "원인": { "발신자": "카우치베이스:1961", "code": 17012, "key": "dml.statement.duplicatekey", "메시지": "중복 키: k10" }, "code": 12009, "원인": "중복 키: k10", "key": "datastore.couchbase.DML_error", "메시지": "DML 오류, 가능한 원인으로는 동시 수정이 있습니다. 키 k10에서 INSERT를 수행하지 못했습니다.", "다시 시도": false } ] |
스택도 포함하려면 다음과 같이 새 객체를 구성해야 합니다:
W를 반환합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[ { "발신자": "couchbase:2088", "원인": { "발신자": "카우치베이스:1961", "code": 17012, "key": "dml.statement.duplicatekey", "메시지": "중복 키: k10" }, "code": 12009, "원인": "중복 키: k10", "key": "datastore.couchbase.DML_error", "메시지": "DML 오류, 가능한 원인으로는 동시 수정이 있습니다. 키 k10에서 INSERT를 수행하지 못했습니다.", "다시 시도": false, "stack": "doInsert에서 오류\n(functions/n1ql.js:3:17)" } ] |
이 이야기의 교훈은 오류를 반환하는 방법과 형식에 유의해야 한다는 것입니다.
결론
여러 블로그에 걸쳐 N1QL 실행, 문서 처리 및 데이터 조작, 오류 처리에 대해 살펴보았습니다.
다음 시리즈에서는 준비된 명세서로 이동합니다.