【问题标题】:PouchDB sync in Cordova applicationCordova 应用程序中的 PouchDB 同步
【发布时间】:2016-05-04 08:35:00
【问题描述】:

我正在使用 pouchdb 使我的应用程序脱机。我创建了一个 couchdb 服务,在本地创建一个 pouchdb 数据库。我的代码在浏览器上做得很好。它在本地创建所有文档并与远程服务器同步。但是当我在 android 平台的 Cordova 应用程序上运行代码时,它会创建本地数据库,但不会与远程 couchdb 数据库同步数据……我的服务代码如下:

angular.module('couchDB.services', ["pouchdb"]).factory('CouchDBServices', CouchDBServices);

    CouchDBServices.$inject = ['$q'];

/**
 * @name CouchDBServices
 * @desc Singleton service class with static methods for actions with CouchDB.
 * @param $q - service that helps you run functions asynchronously, and use their return values
 *              when they are done processing
 * @param pouchDB - service with asynchronous APIs for work with couchDB
 * @param SERVER_ADDRESS - constant - remote url to couchdb instance
 */
function CouchDBServices($q) {


    var db = new PouchDB("user");
    console.log( db);
    var remote="https://couchdb-6ea670.smileupps.com/chat";

    PouchDB.sync(db, remote, {live: true, retry: true})

    return {
        getDocument:getDocument,
        getDocuments:getDocuments,
        createDocument:createDocument,
        updateDocument:updateDocument,
        checkUser:checkUser,
        auth:auth,
        conversationExists:conversationExists
    };

    //Document function

    /**
     * @name getDocument
     * @desc  function fetch specific document from couchdb database
     * @param id - document id
     * @returns document
     */
    function getDocument(id){




        console.log("CouchDBServices.getDocument()");
        var q = $q.defer();
        db.get(id).then(function (doc) {
            console.log("success: "+doc);
            q.resolve(doc);
        }).catch(function (err) {
            console.log("error; "+err);
            q.reject(err);
        });
        return q.promise;
    }

    /**
     * @name getDocuments
     * @desc  function fetch document's from couchdb database
     * @param ids - array of documents id
     * @returns documents
     */
    function getDocuments(ids){
        console.log("CouchDBServices.getDocuments()");
        var q = $q.defer();
        db.allDocs({
            keys:ids,
            include_docs:true
        }).then(function (doc) {
            console.log("success: "+doc);
            q.resolve(doc);
        }).catch(function (err) {
            console.log("error; "+err);
            q.reject(err);
        });
        return q.promise;
    }

    /**
     * @name createDocument
     * @desc  function create document in couchdb database
     * @param data - object with key - value properties
     * @returns information about successfully or not successfully created document
     */
    function createDocument(data){
        console.log("CouchDBServices.createDocument()");
        var q = $q.defer();


        db.put(data)
            .then(function (response) {
                console.log("success: "+JSON.stringify(response));
              q.resolve(response);
            }).catch(function (err) {
                q.reject(err);
              console.log("err: "+err);
            });
        return q.promise;
    }

    /**
     * @name updateDocument
     * @desc  function update specific document in couchdb database
     * @param id - document id
     * @param data - object with key - value properties
     * @returns information about successfully or not successfully created document
     */
    function updateDocument(id,data){
        console.log("CouchDBServices.updateDocument()");
        var q = $q.defer();
        db.get(id).then(function(doc) {
            return db.put(
                data,
                doc._id,
                doc._rev
            );
        }).then(function(response) {
            console.log("success: "+response);
            q.resolve(response);
        }).catch(function (err) {
            console.log("err"+err);
            q.reject(err);
        });
        return q.promise;
    }

    //Query methods - uses design documents

    /**
     * @name checkUser
     * @desc  function checks if user (user document) exists in database
     * @param userId - user id ie. document id
     * @returns object with document id and info that user exists,
     *          empty object if not exists and error if something isn't ok
     */
    function checkUser(userId){
        console.log("CouchDBServices.checkUser()");
        var q = $q.defer();
        db.query('user/userExists', {
            key          : userId,
            include_docs : false,
            limit        : 1
        }).then(function (res) {
            console.log("success: "+res);
            q.resolve(res);
        }).catch(function (err) {
            q.reject(err);
            console.log("err: "+err);
        });
        return q.promise;
    }

    /**
     * @name auth
     * @desc  function checks if user (user document) exists in database
     * @param user - object with user phone and password
     * @returns object with user document if exists,
     *          empty object if not exists and error if something isn't ok
     */
    function auth(user){
        console.log("CouchDBServices.auth()");
        var q = $q.defer();
        db.query('user/auth', {
            key         : [user.phone,user.password],
            include_docs : true
        }).then(function (res) {
            console.log("success: "+res);
            q.resolve(res);
        }).catch(function (err) {
            q.reject(err);
            console.log("err: "+err);
        });
        return q.promise;
    }

    /**
     * @name conversationExists
     * @desc  function checks if specific conversation document exists in database
     * @param chatId - id of conversation document
     * @returns object with conversation document if exists,
     *          empty object if not exists and error if something isn't ok
     */
    function conversationExists(chatId){
        console.log("CouchDBServices.conversationExists()");
        var q = $q.defer();
        db.query('conversation/chatExists', {
            key          : chatId,
            include_docs : true,
            limit        : 1
        }).then(function (res) {
            console.log("success: "+res);
            q.resolve(res);
        }).catch(function (err) {
            q.reject(err);
            console.log("err: "+err);
        });
        return q.promise;
    }
}

【问题讨论】:

    标签: cordova


    【解决方案1】:

    你很可能错过了:

    1. 从设备到 CouchDB 的连接,
    2. 您的 CouchDB 未绑定到 0.0.0.0,而是绑定到 127.0.0.1,这意味着它无法接受来自网络上其他设备的连接,
    3. 您的 CouchDB 没有配置 CORS(尝试 add-cors-to-couchdb)

    它可能是这些东西中的任何一种。最简单的解决方法是使用chrome://inspect 检查Android 设备(在Chrome 中打开;有说明here)。然后查看“网络”选项卡,看看错误是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2019-06-20
      • 2023-03-11
      • 1970-01-01
      • 2014-12-23
      • 2018-10-28
      相关资源
      最近更新 更多