使用带有加密袋的pouchDB中的设计文档

时间:2016-01-29 19:07:36

标签: ionic-framework pouchdb documents

在为我的Ionic项目测试pouchDB之后,我尝试用crypto-bag加密我的数据。但我使用设计文档时遇到问题。我使用了以下代码:

  1. 我的一份设计文件:

    var allTypeOne = {
      _id: '_design/all_TypeOne',
        views: {
            'alle_TypeOne': {
            map: function (doc) {
                if (doc.type === 'type_one') {
                    emit(doc._id);
                }
            }.toString()
          }
        }
    };
    
  2. 对于init我的数据库:

    function initDB() {
      _db = new PouchDB('myDatabase', {adapter: 'websql'});
      if (!_db.adapter) {
        _db = new PouchDB('myDatabase');
      }
      return _db.crypto(password)
        .then(function(){
          return _db;
        });
    
      // add a design document
      _db.put(allTypeOne).then(function (info) {
    
      }).catch(function (err) {
    
      }
    }
    
  3. 获取type_one的所有文档:

    function getAllData {
      if (!_data) {
        return $q.when(_db.query('all_TypeOne', { include_docs: true}))
          .then(function(docs) {
            _data = docs.rows.map(function(row) {
              return row.doc;
            });
            _db.changes({ live: true, since: 'now', include_docs: true})
              .on('change', onDatabaseChange);
            return _data;
          });
      } else {
        return $q.when(_data);
      }
    }
    
  4. 此代码可以在不使用加密袋的情况下正常工作,但如果我插入_db.crypto(...),则列表中不会显示任何数据。谁能帮我?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我猜你在加密调用完成之前就已经发生了这个问题。请记住,javascript是异步的。因此,在设计文档之前,请等待加密调用完成。然后在完成后使用回调来访问您的数据库。如下所示:

function initDB(options) {
  _db = new PouchDB('myDatabase', {adapter: 'websql'});
  if (!_db.adapter) {
    _db = new PouchDB('myDatabase');
  }

  _db.crypto(password)
    .then(function(){
       // add a design document
       _db.put(allTypeOne).then(function (info) {
         options.success(_db);
       })
      .catch(function (err) { console.error(err); options.error(err)})
    .catch(function (err) { console.error(err); options.error(err);})
  }
}

initDB({
  success:function(db){
    db.query....
  }
)