Настройка PouchDB для репликации Sync Gateway Walrus

Мне трудно настроить репликацию между PouchDB и Sync Gateway.

Я попытался подписаться на сообщение в блоге Couchbase, но у меня тоже не получилось.

Я создаю приложение Ionic с angular-pouchdb и ng-pouchdb.

Вот что я понял до сих пор:

  1. каждый раз, когда я вызываю pouchCollection, он либо создает новая база данных с заданным именем или дает вам ссылку на уже созданную базу данных;
  2. Sync Gateway отвечает за авторизацию каждого документа. Я запускаю его сейчас с включенным пользователем GUEST, с "admin_channels": ["*"], так что все должны иметь доступ ко всему, верно?
  3. CORS должен быть включен, так как и приложение, и сервер работают на одном компьютере (localhost)
  4. чтобы получить репликацию в обоих направлениях, я должен использовать db.sync(URL) (angular-pouchdb), где URL - это что-то вроде http://localhost:4984/prospect/prospect может быть именем БД)

Вот мой файл Sync Gateway config.json:

{
  "log": ["CRUD", "REST+", "Access"],
  "facebook": {"register": true},
  "CORS": {
    "Origin": ["http://localhost:8100"],
    "LoginOrigin": ["http://localhost:8100"],
    "Headers": ["Content-Type"],
    "MaxAge": 17280000
  },
  "databases": {
    "prospect": {
      "server": "walrus:",
      "users": {
        "GUEST": {"disabled": false, "admin_channels": ["*"]}
      },
      "sync":
      `
      function(doc, oldDoc) {
        channel("everything");
      }
      `
    }
  }
}

Вот мой ионный код:

app.controller('MyCtrl', function($scope, pouchCollection) {
  $scope.students = pouchCollection('students');
  var URL = 'http://localhost:4984/prospect/';
  $scope.students.$db.replicate.sync(URL);
// ...list the array in the view
}

Всякий раз, когда я пытаюсь заставить репликацию работать, я получаю следующее в консоли при первом запуске:

GET http://localhost:4984/prospect/_local/jeOaLtKGemQWDpNAPzorJQ%3D%3D?_nonce=1442271117949 404 (Not Found)xhRequest @ pouchdb.js:641625.module.exports @ pouchdb.js:6435ajax @ pouchdb.js:604824.module.exports @ pouchdb.js:6211ajax @ pouchdb.js:989(anonymous function) @ pouchdb.js:994ajaxPromise @ pouchdb.js:993(anonymous function) @ pouchdb.js:1241(anonymous function) @ pouchdb.js:1069979 @ pouchdb.js:10760(anonymous function) @ pouchdb.js:7659(anonymous function) @ pouchdb.js:764679 @ pouchdb.js:1076068.Checkpointer.getCheckpoint @ pouchdb.js:9407(anonymous function) @ pouchdb.js:10076
pouchdb.js:6416 GET http://localhost:4984/prospect/_local/2_QcxPjLD.zmtOXa7VM8Gw%3D%3D?_nonce=1442271117953 404 (Not Found)xhRequest @ pouchdb.js:641625.module.exports @ pouchdb.js:6435ajax @ pouchdb.js:604824.module.exports @ pouchdb.js:6211ajax @ pouchdb.js:989(anonymous function) @ pouchdb.js:994ajaxPromise @ pouchdb.js:993(anonymous function) @ pouchdb.js:1241(anonymous function) @ pouchdb.js:1069979 @ pouchdb.js:10760(anonymous function) @ pouchdb.js:7659(anonymous function) @ pouchdb.js:764679 @ pouchdb.js:10760(anonymous function) @ pouchdb.js:9408
pouchdb.js:6416 GET http://localhost:4984/prospect/_local/jeOaLtKGemQWDpNAPzorJQ%3D%3D?_nonce=1442271118095 404 (Not Found)xhRequest @ pouchdb.js:641625.module.exports @ pouchdb.js:6435ajax @ pouchdb.js:604824.module.exports @ pouchdb.js:6211ajax @ pouchdb.js:989(anonymous function) @ pouchdb.js:994ajaxPromise @ pouchdb.js:993(anonymous function) @ pouchdb.js:1241(anonymous function) @ pouchdb.js:1069979 @ pouchdb.js:10760(anonymous function) @ pouchdb.js:7659(anonymous function) @ pouchdb.js:764679 @ pouchdb.js:10760updateCheckpoint @ pouchdb.js:930368.Checkpointer.updateTarget @ pouchdb.js:936868.Checkpointer.writeCheckpoint @ pouchdb.js:9362finishBatch @ pouchdb.js:9829
(index):28 The above 404 is totally normal. PouchDB is just checking if a remote checkpoint exists.

Поскольку последняя строка говорит, что это нормально, я предполагаю, что все в порядке.

When I run the app in the browser and in the emulator, Sync Gateway says things like:
2015-09-14T19:54:04.913-03:00 HTTP:  #001: GET /prospect/?_nonce=1442271244612
2015-09-14T19:54:18.730-03:00 HTTP:  #002: GET /prospect/?_nonce=1442271258729
...
2015-09-14T19:56:13.362-03:00 HTTP:  #049: GET /prospect/_local/2_QcxPjLD.zmtOXa7VM8Gw==?_nonce=1442271373356
2015-09-14T19:56:13.376-03:00 HTTP:  #050: PUT /prospect/_local/2_QcxPjLD.zmtOXa7VM8Gw==

По мне так все работает. Но я не могу синхронизировать его с эмулятором iOS или в другом браузере.

Что мне не хватает?


person EuAndreh    schedule 14.09.2015    source источник
comment
Что вы подразумеваете под «другим браузером»? Что вы используете?   -  person sweetiewill    schedule 19.09.2015
comment
Кажется, вы получаете успешные ответы, может быть, это на стороне вашего клиента? Можете ли вы опубликовать свой код iOS, чтобы узнать, почему вы не можете синхронизировать его с эмулятором?   -  person sweetiewill    schedule 19.09.2015
comment
@sweetiewill: На самом деле, я использую фреймворк Ionic. Под «другим браузером» я подразумеваю попытку синхронизации между Chrome и Safari.   -  person EuAndreh    schedule 19.09.2015
comment
@sweetiewill Готово: добавлен пример кода Ionic. Насколько я мог видеть, db.changes из библиотеки ng-pouchdb работает корректно. Я поставил там точку останова, но она не вызывалась, когда я пытался синхронизировать вещи.   -  person EuAndreh    schedule 19.09.2015


Ответы (1)


На ваши вопросы..

[2]: * Канал со звездочкой — это канал, в который автоматически добавляется каждый документ. Например, гостевому пользователю будет предоставлен канал со звездочкой *, где это дает вам открытый доступ, поэтому любой пользователь, получивший * (звезду), сможет видеть все в системе.

[3]: вам не нужно включать CORS, так как шлюз синхронизации работает в том же домене, что и ваше веб-приложение. Включение CORS позволяет веб-приложениям получать доступ к ресурсам в других доменах, а не в исходном домене.

Список LoginOrigin защищает доступ к конечным точкам _session и _facebook.

[4]: Чтобы реплицировать ваши данные, в файле app.js вы должны определить переменную URL для синхронизации, например:

var SYNC_GATEWAY_URL = 'http://127.0.0.1:4984/prospect/';
person sweetiewill    schedule 19.09.2015
comment
[2]: То есть, если я куда-нибудь что-нибудь добавлю, канал "*" это увидит, верно? [3]: Спасибо, я копну глубже =] - person EuAndreh; 19.09.2015
comment
Привет, тебе удалось убрать постоянное сообщение об ошибке? Я постоянно получаю сообщение об ошибке GET Http://localhost:4984/mybucket /_local/ 404 (Not Found) Это нормально, это создает много журнала ошибок и почему это не найдено? - person tbo; 30.11.2015
comment
Я обнаружил, что получаю ошибку _bulk_get всякий раз, когда обновляю окно, а локальный объект PouchDB воссоздается и пытается синхронизироваться, и я получаю ошибку удаленной контрольной точки всякий раз, когда база данных уничтожается, а затем воссоздается (и пытается синхронизироваться)... но в обоих случаях это не является фатальным, если нижестоящий рабочий процесс рассчитан на ожидание завершения обещания. - person R J; 17.12.2017