2014년 12월 23일 화요일

sailsjs에서 localDiskDb에서 다른 데이터베이스로 전환시 트러블 슈팅

개요

sails 0.10.4, 0.10.5의 버전에 있어서 아래와 같은 에러가 발생하는 경우가 있다.

/[myProject]/node_modules/sails-disk/lib/database.js:209
      self.collections[collectionName]._cast.run(values);
                                      ^
TypeError: Cannot read property '_cast' of undefined
    at /[myProject]/node_modules/sails-disk/lib/database.js:209:39
    at Array.map (native)
    at Database.read (/[myProject]/node_modules/sails-disk/lib/database.js:208:32)
    at Array.async.auto.checkData [as 0] (/[myProject]/node_modules/sails-disk/lib/database.js:59:12)
    at /[myProject]/node_modules/sails-disk/node_modules/async/lib/async.js:459:38
    at Array.forEach (native)
    at _each (/[myProject]/node_modules/sails-disk/node_modules/async/lib/async.js:32:24)
    at Object.async.auto (/[myProject]/node_modules/sails-disk/node_modules/async/lib/async.js:430:9)
    at Database.initialize (/[myProject]/node_modules/sails-disk/lib/database.js:55:9)
    at Object.module.exports.adapter.registerConnection (/[myProject]/node_modules/sails-disk/lib/adapter.js:51:40)

위 증상은 sails-disk의 내부구조에 있어서 sails-disk가 기존의 캐시 정보를 토대로 한번이라도 sails-disk였던 적이 있는 테이블에 대해 {database.js}.collections의 key에 대해 collectionName으로 접근하려 한 경우 발생하는 에러로, 데이터의 atomicity가 유지되지 않아 발생하는 문제이다.

대책

극단적인 방법으로, sailsjs프로젝트 폴더의 .tmp폴더 이하의 로컬db파일을 삭제해버리면 증상은 해결된다. 엄밀히는 내부에 캐시된 자료중 데이터베이스로 전환된 부분에 대한 캐시내역을 지우면 될듯 하지만, 애초에 localDiskDb는 개발과정에서만 사용하게끔 전제가 되어있는 물건이고 production에서 사용하는 일은 없을거라 생각되니 실상 그냥 .tmp폴더의 삭제제 혹은 .tmp내부의 localDiskDb.db파일을 삭제하는 거로 충분할거라 생각된다.


댓글 없음:

댓글 쓰기