添加 cache.manifest 后,AngularJS/PouchDB 应用程序停止同步到 CouchDB

2023-11-22

我有一个使用 AngularJS 编写的单页 ​​Web 应用程序。它使用 PouchDB 复制到 CouchDB 服务器并且工作正常。

当我尝试通过添加cache.manifest 将网页转换为可离线使用时,问题就出现了。突然间,所有复制任务都会抛出错误并停止工作,无论是离线工作还是在线工作。

在 Chrome 中,它只是显示“GET ...myCouchIP/myDB/?_nonce=CxVFIwnEJeGFcyoJ net::ERR_FAILED”

在 Firefox 中,它也会抛出错误,但提到请求被阻止 - 尝试启用 CORS。

按照 PouchDB 设置页面的说明在远程 CouchDB 上启用 CORS。另外,在不使用cache.manifest的情况下它工作得很好(即它对我的办公桌、服务器和虚拟机之间的所有不同的IP地址非常满意——它是一个原型,所以此时没有域名)。

顺便说一句,此时我没有使用任何类型的身份验证。管理方生效。

那么添加cache.manifest后会发生什么变化呢?线索不胜感激。 提前致谢。

app.js

var app = angular.module('Assets', ['assets.controllers', 'ngRoute']);

app.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
    when('/', {
        controller: 'OverviewCtrl',
        templateUrl: 'views/overview.html'
    }).
    when('/new', {
        controller: 'NewMachineCtrl',
        templateUrl: 'views/machineForm.html'
    }).
    otherwise({redirectTo: '/'});
}]);

控制器.js

var _control = angular.module('assets.controllers', ['assets.services']);

_control.controller('OverviewCtrl', ['$scope', 'Machine', function($scope, Machine) {
    var promise = Machine.getAll();

    promise.then(function(machineList) {
        $scope.machines = machineList;
    }, function(reason) {
        alert('Machine list is empty: ' + reason);
    });
}]);

_control.controller('UpdateMachineCtrl', ['$scope', '$routeParams', 'Machine', 
                                            function($scope, $routeParams, Machine) {
    $scope.title = "Update Installation Details";
    var promise = Machine.getSingle($routeParams.docId);

    promise.then(function(machine) {
        $scope.machine = machine;
    }, function(reason) {
        alert('Record could not be retrieved');
    });

    $scope.save = function() {
        Machine.update($scope.machine);
    };
}]);

_control.controller('SyncCtrl', ['$scope', 'Machine', function($scope, Machine) {
    $scope.syncDb = function() {
        Machine.sync();
        Machine.checkConflicts();
    };

    $scope.checkCors = function() {
        // Check CORS is supported
        var corsCheck = function(method, url) {
          var xhr = new XMLHttpRequest();

          if ("withCredentials" in xhr) {
            // XHR for Chrome/Firefox/Opera/Safari.
            xhr.open(method, url, true);
          } else if (typeof XDomainRequest != "undefined") {
            // XDomainRequest for IE.
            xhr = new XDomainRequest();
            xhr.open(method, url);
          } else {
            // CORS not supported.
            console.log('CORS not supported by browser');
          }

          xhr.onload = function() {
              console.log('Response from CORS ' + method + ' request to ' + url + ': ' + xhr.responseText);
          };
          xhr.onerror = function() {
              console.log('Error response from CORS ' + method + ' request to ' + url + ': ' + xhr.responseText);
          };

          xhr.send();
        };

        var server = 'http://10.100.3.21:5984/ass_support';

        corsCheck('GET', server);
        corsCheck('PUT', server);
        corsCheck('POST', server);
        corsCheck('HEAD', server);
//      corsCheck('DELETE', server);
    };
}]);

服务.js

var _service = angular.module('assets.services', []);

_service.constant('dbConfig',{
    dbName: 'assets',
    dbServer: 'http://myCouchServerIp:5984/'
});

/**
 * Make PouchDB available in AngularJS.
 */
_service.factory('$db', ['dbConfig', function(dbConfig) {
    PouchDB.enableAllDbs = true;
    var localDb = new PouchDB(dbConfig.dbName);
    var remoteDb = dbConfig.dbServer + dbConfig.dbName;
    var options = {live: true};
    var syncError = function() {
        console.log('Problem encountered during database synchronisation');
    };

    console.log('Replicating from local to server');
    localDb.replicate.to(remoteDb, options, syncError);

    console.log('Replicating from server back to local');
    localDb.replicate.from(remoteDb, options, syncError);   

    return localDb; 
}]);

_service.factory('Machine', ['$q', '$db', '$rootScope', 'dbConfig', 
                   function($q, $db, $rootScope, dbConfig) {
    return {
        update: function(machine)  {
            var delay = $q.defer();

            var doc = {
               _id: machine._id,
               _rev: machine._rev,
               type: machine.type,
               customer: machine.customer,
               factory: machine.factory,
               lineId: machine.lineId,
               plcVersion: machine.plcVersion,
               dateCreated: machine.dateCreated,
               lastUpdated: new Date().toUTCString()
            };

            $db.put(doc, function(error, response) {
                $rootScope.$apply(function() {
                    if (error) {
                        console.log('Update failed: ');
                        console.log(error);
                        delay.reject(error);
                    } else {
                        console.log('Update succeeded: ');
                        console.log(response);
                        delay.resolve(response);
                    }
                });
            });

            return delay.promise;
        },
        getAll: function() {
            var delay = $q.defer();

            var map = function(doc) {
                if (doc.type === 'machine') {
                    emit([doc.customer, doc.factory], 
                            {
                                _id: doc._id,
                                customer: doc.customer, 
                                factory: doc.factory,
                                lineId: doc.lineId, 
                                plcVersion: doc.plcVersion,
                            }
                    );
                }
            };

            $db.query({map: map}, function(error, response) {
                $rootScope.$apply(function() {
                    if (error) {
                        delay.reject(error);
                    } else {
                        console.log('Query retrieved ' + response.rows.length + ' rows');
                        var queryResults = [];

                        // Create an array from the response 
                        response.rows.forEach(function(row) {
                            queryResults.push(row.value);
                        });

                        delay.resolve(queryResults);
                    }
                });
            });

            return delay.promise;
        },
        sync: function() {
            var remoteDb = dbConfig.dbServer + dbConfig.dbName;
            var options = {live: true};
            var syncError = function(error, changes) {
                console.log('Problem encountered during database synchronisation');
                console.log(error);
                console.log(changes);
            };
            var syncSuccess = function(error, changes) {
                console.log('Sync success');
                console.log(error);
                console.log(changes);
            };

            console.log('Replicating from local to server');
            $db.replicate.to(remoteDb, options, syncError).
                on('error', syncError).
                on('complete', syncSuccess);

            console.log('Replicating from server back to local');
            $db.replicate.from(remoteDb, options, syncError);       
        }
    };
}]);

_service.factory('dbListener', ['$rootScope', '$db', function($rootScope, $db) {
    console.log('Registering a onChange listener');
    $db.info(function(error, response) {
        $db.changes({
            since: response.update_seq,
            live: true,
        }).on('change', function() {
            console.log('Change detected by the dbListener');
            // TODO work out why this never happens
        });
    });
}]);

缓存清单

CACHE MANIFEST

# views
views/machineForm.html
views/overview.html

# scripts
scripts/vendor/pouchdb-2.2.0.min.js
scripts/vendor/angular-1.2.16.min.js
scripts/vendor/angular-route-1.2.16.min.js

scripts/app.js
scripts/controllers/controller.js
scripts/services/service.js

索引.html

<!DOCTYPE html>
<html lang="en" manifest="cache.manifest" data-ng-app="Assets">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Asset Management</title>

<script src="scripts/vendor/angular-1.2.16.min.js" type="text/javascript"></script>
<script src="scripts/vendor/angular-route-1.2.16.min.js" type="text/javascript></script>
<script src="scripts/vendor/pouchdb-2.2.0.min.js" type="text/javascript"></script>

<script src="scripts/app.js" type="text/javascript"></script>
<script src="scripts/services/service.js" type="text/javascript"></script>
<script src="scripts/controllers/controller.js" type="text/javascript"></script>
</head>
<body>
    <div id="content">
    <nav class="sidebar">
    <h3>Options</h3>
    <div>
        <a class="active" data-ng-href="#/">Overview</a>
        <a data-ng-href="#" data-ng-controller="SyncCtrl" data-ng-click="syncDb()">Synchronise</a>
        <a data-ng-href="" data-ng-controller="SyncCtrl" data-ng-click="checkCors()">Check CORS</a>
    </div>
    </nav>

    <section class="main">
        <div data-ng-view></div>
    </section>
    </div>  
</body>
</html>

概述.html

<h3>Installation Overview</h3>
<table>
    <tr>
        <th>Customer</th>
        <th>Factory</th>
        <th>Line Id</th>
        <th>PLC Version</th>
    </tr>
    <tr data-ng-repeat="machine in machines">
        <td>{{machine.customer}}</td>
        <td>{{machine.factory}}</td>
        <td><a data-ng-href="#/view/{{machine._id}}">{{machine.lineId}}</a></td>
        <td>{{machine.plcVersion}}</td>
    </tr>
</table>

machineForm.html

<h3>{{title}}</h3>
<form name="machineForm" data-ng-submit="save()">
    <div>
    <label for="customer">Customer:</label>
<div><input data-ng-model="machine.customer" id="customer" required></div>
    </div>

    <div>
    <label for="factory">Factory:</label>
    <div><input data-ng-model="machine.factory" id="factory" required></div>
    </div>

    <div>
<label for="lineId">Line ID:</label>
    <div><input data-ng-model="machine.lineId" id="lineId" required></div>
    </div>

    <div>
<label for="plcVersion">PLC Version:</label>
    <div><input data-ng-model="machine.plcVersion" id="plcVersion"></div>
    </div>

    <div><button data-ng-disabled="machineForm.$invalid">Save</button></div>
</form>

尝试将您的cache.manifest 文件更改为:

CACHE MANIFEST

CACHE:
# views
views/machineForm.html
views/overview.html

# scripts
scripts/vendor/pouchdb-2.2.0.min.js
scripts/vendor/angular-1.2.16.min.js
scripts/vendor/angular-route-1.2.16.min.js

scripts/app.js
scripts/controllers/controller.js
scripts/services/service.js

NETWORK:
*

使用清单文件时,all即使您在线,非缓存资源也会在缓存页面上失败。 NETWORK 部分告诉浏览器允许对非缓存资源的请求(当然,离线时它们仍然会失败)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加 cache.manifest 后,AngularJS/PouchDB 应用程序停止同步到 CouchDB 的相关文章

  • 如何触发UI-Router View Load事件?

    第一次测试 ui router 但目前测试事件 我似乎无法理解如何触发 viewContentLoaded 或 Loading 虽然 我已经有 stageChangeSuccess 等工作了 我只是把一切都推到了http punkbit c
  • 在 Angularjs 中格式化输入值

    我正在尝试编写一个指令 自动格式化数字
  • 角度 ui 路由器的动态参数

    我想知道在更改状态并发送请求以从后端获取模板时如何包含参数 这是我的应用程序 angular module questionnaireApp ngAnimate ui router ui bootstrap config stateProv
  • 如何使用 TypeScript 和 Angular 2 将插件添加到 ng2-ckeditor ?

    我正在尝试添加Justify插件到我的 ckeditor 但不幸的是我找不到任何关于如何将插件添加到 ng2 ckeditor 的信息 另外 我找不到任何应该添加插件的目录或配置文件 我正在使用 ng2 ckeditor1 0 6使用 Ty
  • 如何识别 YouTube 播放器的音量变化

    我正在使用 angualr youtube embed 指令将 YouTube 播放器嵌入到我的 Angular Web 应用程序中 因为我必须识别播放和暂停以及音量变化事件 为了监听播放和暂停事件 我使用下面给出的代码 scope on
  • 在模态中打开模态

    我有一个有角度的 ui 模态 其中有一个按钮 单击此按钮时 我想在 Angular ui 中打开另一个模式 我该怎么做 scope open function var modalInstance modal open templateUrl
  • cordova.js 导致引用错误“未定义需求”

    我想用恩科尔多瓦检测设备的网络状态 然而 一旦我包括科尔多瓦 js我收到一个错误 未捕获的引用错误 未定义 require cordova js 23 我已经安装并成功运行Node js and Cordova 我已经下载并安装了恩科尔多瓦
  • 如何删除带有空“”文档 ID 的 couchdb 文档?

    我在数据库中看到的文档是这样的 id rev 1 2f11e026763c10730d8b19ba5dce7565 禁止 必须提供最新的 rev以更新现有包 我在文档中看到的所有内容都显示引用带有 ID 的文档 但这当然不可能发生 我不太确
  • 在 History popstate 事件中获取 AngularJs $scope?

    我是 angularjs 开发新手 我有 var app angular module myapp app controller ProductCtrl scope sce function scope sce scope products
  • AngularJs 数据绑定不适用于 ionic

    我觉得我在离子输入文本中遗漏了一些明显的东西 我在用angular ui router这条路线 stateProvider state findPersons url findPersons templateUrl html findPer
  • 如何删除 ng-repeat 的默认顺序

    如何停止动态表数据的 ng repeat 内部的默认排序 目前我收到以下订单 地址 客户 ID 姓名 但我想要的是以下顺序 客户 ID 名称 地址 任何帮助我将不胜感激 JS app controller MyController func
  • 以角度选择项目后保持菜单打开

    单击我的菜单后 我的菜单将关闭toggleShare按钮 我怎样才能防止这种情况 我将 angularJS 与 Angular 材料一起使用 这是我的代码
  • Angular.js:未捕获的错误,没有模块:myapp

    我也在尝试引导 angular js 项目 这是我的index html div p Loading p div
  • 根据用户区域设置过滤字符串列表

    当使用 AngularJS 1 6 处理 JavaScript 项目时 我有一个要过滤的字符串列表 例如 假设我的列表包含 rbol cig e a nido and tubo 当过滤西班牙语字符串时 如果我过滤 u 我会期望两者cig e
  • 如何在angularjs中使用addClass方法

    我有一个仅限于类的 angularjs 指令 如何使用 angularjs 中的 addClass 方法添加它 指示 app directive number function return restrict C link function
  • 在角度控制器中监听文档事件

    如何捕获角度控制器中的事件 我有文档级事件 所以我需要在角度控制器中捕获事件 这可能吗 Update 我有独立的 js 文件来处理来自相机的一些操作 document addEventListener myCameraEvent handl
  • 如何在量角器中模拟拖放动作?

    我有一个双滑块 我想测试它是否可操作并返回正确的数据 滑块有一个最小和一个最大处理程序 它还有一些 我可以挂钩的断点 我想要模拟的是 handler max 元素的 touchStart 将拇指移动到类为 step 3 的元素上 handl
  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • 如何清除单个函数中的所有 AngularJS $scope 和 $rootScope 值?

    我需要清除所有 scope执行某些操作时的值 例如 如果我点击 Signout 按钮重定向到 signin 页面 然后所有 scope or rootScope应清除会话中的值 我怎样才能实现这个目标 您可以执行以下操作 rootScope
  • 在 Angular 中让多个调用等待同一个 Promise

    我在一个页面上有多个使用相同服务的控制器 为了举例 我们将服务称为 USER 第一次调用 USER getUser 时 它会发出 http 请求来获取有关用户的数据 调用完成后 它将数据存储在 USER data 中 如果再次调用 USER

随机推荐

  • 在 PL/SQL 中打印记录字段

    如何在 PL SQL 中打印记录变量的所有字段 记录变量有很多字段 那么有没有比打印每个字段更好的方法呢 也尝试过动态sql但没有帮助 基于 Ollies 使用 dbms output 构建 但用于动态遍历光标 设置用于测试 create
  • ASP.NET MVC 3 - 在 jquery 对话框中编辑动态添加到模型集合的项目

    我是 MVC 新手 所以我不确定这里最好的方法是什么 我有一个视图模型 其中包含几个像这样的集合 public class MainViewModel public List
  • iPhone Web 应用程序可以使用相机吗?

    我有一个网络应用程序 我想拍照然后将它们上传到服务器 这可以通过网络应用程序完成吗 编辑 现在可以了 请参阅下面的答案 不可以 webapp 无法访问内部设备 尝试使用 PhoneGap 来缩小您的应用程序和内部设备之间的差距 但这将编译一
  • 通过列表和数组中的索引获取结构体项目

    当我使用数组时structs 例如 System Drawing Point 我可以通过索引获取项目并更改它 例如 此代码工作正常 Point points new Point new Point 0 0 new Point 1 1 new
  • 寻找曲线上的最佳权衡点

    假设我有一些数据 我想为其拟合参数化模型 我的目标是找到该模型参数的最佳值 我正在使用AIC BIC MDL奖励低误差模型的标准类型 但也会惩罚高复杂性的模型 可以说 我们正在为这些数据寻找最简单但最令人信服的解释 a la奥卡姆剃刀 根据
  • 如何在不删除 R 中存在 NA 的行的情况下执行聚类

    我有一个数据 其元素中包含一些 NA 值 我想做的是执行聚类而不删除行NA 存在的地方 我明白那个gower距离测量单位daisy允许这种情况 但为什么我下面的代码不起作用 我欢迎 雏菊 以外的其他选择 plot heat map with
  • Flutter Workmanager 插件在运行任务时无法与任何其他插件一起使用

    初始化工作管理器并创建任一任务后 如果我们在任务执行中使用任何插件 它将无法被识别并抛出如下错误 MissingPluginException 在通道 lyokone location 上找不到方法 getLocation 的实现 实际代码
  • 为什么 stdafx.h 会这样工作?

    像往常一样 当我的大脑搞乱了我自己无法弄清楚的事情时 我会向你们寻求帮助 这次我一直想知道为什么 stdafx h 会这样工作 据我了解 它做了两件事 包括我们的标准标头might 使用并且很少改变 作为编译器书签 代码不再预编译 现在 这
  • BOOST_CHECK_EQUAL 带有pair 和自定义运算符<<

    当尝试执行 BOOST CHECK EQUAL pair pair 时 尽管声明了它 但 gcc 找不到pair的流运算符 有趣的是 std out 找到了运算符 ostream operator lt lt ostream s const
  • 检测类型是否是主模板的专业化或用户提供的专业化

    假设我有这个 template
  • Tensorflow 数据集 API 中的过采样功能

    我想问一下目前的数据集API是否允许实现过采样算法 我处理高度不平衡的阶级问题 我认为在数据集解析 即在线生成 过程中对特定类进行过采样会很好 我已经看到了rejection resample函数的实现 但是这会删除样本而不是复制它们 并且
  • Google 应用引擎 JRE 类“黑名单”

    有一个 JRE 类白名单 对于 Google 应用程序引擎 我真正想要的是一个 黑名单 换句话说 Java API 不能在 GAE 上运行 这样的列表存在吗 开发人员是否在 GAE 上的 Java API 方面遇到过问题 他们似乎更多地采取
  • 使 SimpleDateFormat.parse() 在无效日期上失败(例如月份大于 12)

    我在用着java text SimpleDateFormat解析以下形式的字符串 yyyyMMdd 如果我尝试解析月份大于 12 的字符串 它不会失败 而是会滚动到下一年 完整的可运行重现 import java text ParseExc
  • 颜色的十六进制透明度[重复]

    这个问题在这里已经有答案了 我正在努力为我的应用程序小部件实现小部件透明度选项 尽管我在获取正确的十六进制颜色值时遇到了一些麻烦 作为十六进制颜色透明度的新手 我进行了一些搜索 尽管我找不到我的问题的具体答案 我想通过十六进制颜色设置透明度
  • 如果 Maven 中的传递依赖项来自我父级的其他子模块,我是否应该依赖它们?

    假设我们正在研究mortgage子模块 我们直接使用Google Guava模块代码中的类 但依赖项guava在同一父模块下的其他子模块中定义 我们只能通过对 investment 模块的传递依赖来访问 Guava 类 banking sy
  • UIScrollView 上的边界会随着内容插入而自动更改

    我使用 UIScrollView 作为我的分页滚动视图 pagesScrollView 在其中 我放置了专门用于缩放的单独的 UIScrollView 在每个视图中 我都有一个视图 该视图是应该可缩放的页面项目 所有这些都位于带有半透明导航
  • System.DirectoryServices 很慢?

    当用户登录网站时 我使用下面的代码在活动目录中查找信息 针对本地域运行速度非常快 但通过 VPN 运行到远程受信任域时 速度非常慢 大约需要 7 或 8 秒 从同一个机器到远程域运行 dsa msc 几乎与在本地运行它一样快 我正在使用属性
  • JavaScript 有类吗?

    上周我和一个朋友发生了争执 他说 JavaScript 中不存在类这样的东西 我说有你可以说的var object new Object 他说 因为没有文字class用过的 这不是一个班级 谁是对的 编辑 2017 年 7 月 ECMASc
  • 向 TList 和 TStringList 添加稳定排序的简单方法

    我将 TList TObjectList 和 TStringList 带有关联对象 用于多种任务 或者按原样使用 或者作为更复杂结构的基础 虽然排序功能通常足够好 但有时我需要做一个stable排序 两个列表都使用快速排序 为 TList
  • 添加 cache.manifest 后,AngularJS/PouchDB 应用程序停止同步到 CouchDB

    我有一个使用 AngularJS 编写的单页 Web 应用程序 它使用 PouchDB 复制到 CouchDB 服务器并且工作正常 当我尝试通过添加cache manifest 将网页转换为可离线使用时 问题就出现了 突然间 所有复制任务都