Programming/JavaScript & TypeScript

[NPM SQLite3] statement의 run 쿼리 error handling 방법

Bonita SY 2020. 8. 25. 21:44
728x90
반응형

node.js에서 statement의 run 쿼리 실행 시 error가 발생하면 노드 인스턴스가 다운되는 현상이 있었습니다.

 

기존 로직)

              var stmt = db.prepare(insert_query_str);

              for (let i=0; i<datas.length; i++) {
                let value_list = [];
                
                for (let j=0; j<key_list.length; j++) {
                  let key = key_list[j];
        
                  value_list.push(datas[i][key]);
                }

                stmt.run(value_list);
              }

              stmt.finalize();
              resolve({ status: true, message: `Succees to bulk insert` });

발생한 에러)

{ Error: SQLITE_MISMATCH: datatype mismatch errno: 20, code: 'SQLITE_MISMATCH' }

 

왠지 callback으로 error를 받을 수 있을 것 같아서, 구글링 중에 아래 페이지에서 도움이 되는 문구 발견!

 

documentation 눌러서 들어오니 역시나 callback을 쓸 수 있더라고요~

 

 

https://github.com/mapbox/node-sqlite3/wiki/API#databasepreparesql-param--callback

 

mapbox/node-sqlite3

Asynchronous, non-blocking SQLite3 bindings for Node.js - mapbox/node-sqlite3

github.com

 

 

그래서 아래와 같이 수정했습니다.

              var stmt = db.prepare(insert_query_str, [], function(err) {
                if (err) {
                  reject({ status: false, message: err });
                  return;
                }
              });

              for (let i=0; i<datas.length; i++) {
                let value_list = [];
                
                for (let j=0; j<key_list.length; j++) {
                  let key = key_list[j];
                  
                  value_list.push(datas[i][key]);
                }

                stmt.run(value_list, function(err) {
                  if (err) {
                    console.log(err);
                    reject({ status: false, message: err });
                    return;
                  }
                });
              }

              stmt.finalize();
              resolve({ status: true, message: `Succees to bulk insert` });

 

정상 동작~

728x90
반응형