node.js - 如何使用PouchDB(leveldb)将我的 Electron 应用程序与Cloudant或其他任何支持CouchDB并同步的数据库进行连接

标签 node.js electron couchdb pouchdb cloudant

我正在使用pouchDB创建一个 Electron 应用程序,我希望该应用程序能够区分不同的客户并在他们之间同步数据。作为示例,我正在制作教程:https://github.com/nolanlawson/pouchdb-getting-started-todo,我将代码修改为 Electron 版本,并在cloudant创建了一个noSQL数据库。
目前,我可以保存数据,但是无法与cloudant中的远程数据库同步。这是我用来在两个数据库之间同步数据的端点。
enter image description here
这是我遇到的错误。
enter image description here
这是我的script.js的代码

(function() {

  'use strict';

  var $ = document.querySelector.bind(document);

  var ENTER_KEY = 13;
  var newTodoDom = document.getElementById('new_todo');
  var syncDom = document.getElementById('sync-wrapper');
 

  // EDITING STARTS HERE (you dont need to edit anything above this line)
  var NodePouchDB = require('pouchdb');
  var db = new NodePouchDB('todos');

  var couchdb = require('felix-couchdb')
  var remoteCouch = couchdb.createClient(5984, 'https://ac725f4e-29ec-4614-8e96-02ebc74a529b-bluemix.cloudant.com/')


  db.info(function(err, info) {
    console.log("is working", info)
    db.changes({
      since: info.update_seq,
      live: true
    }).on('change', showTodos);
  });

  // We have to create a new todo document and enter it in the database
  function addTodo(text) {
    var todo = {
      _id: new Date().toISOString(),
      title: text,
      completed: false
    };
    db.put(todo).then(function (result) {
      console.log("everything is A-OK");
      console.log(result);
    }).catch(function (err) {
      console.log('everything is terrible');
      console.log(err);
    });
  }

  // Show the current list of todos by reading them from the database
  function showTodos() {
    db.allDocs({include_docs: true, descending: true}).then(function(doc) {
      redrawTodosUI(doc.rows);
    }).catch(function (err) {
      console.log(err);
    });
  }

  function checkboxChanged(todo, event) {
    todo.completed = event.target.checked;
    console.log(todo);
    db.put(todo);
  }

  // User pressed the delete button for a todo, delete it
  function deleteButtonPressed(todo) {
    db.remove(todo);
  }

  // The input box when editing a todo has blurred, we should save
  // the new title or delete the todo if the title is empty
  function todoBlurred(todo, event) {
    var trimmedText = event.target.value.trim();
    if (!trimmedText) {
      db.remove(todo);
    } else {
      todo.title = trimmedText;
      db.put(todo);
    }
  }

  // Initialise a sync with the remote server
  function sync() {
    syncDom.setAttribute('data-sync-state', 'syncing');
    
    var opts = {live: true};
    db.sync(remoteCouch, opts, syncError);
  }

  // EDITING STARTS HERE (you dont need to edit anything below this line)

  // There was some form or error syncing
  function syncError() {
    syncDom.setAttribute('data-sync-state', 'error');
  }

  // User has double clicked a todo, display an input so they can edit the title
  function todoDblClicked(todo) {
    var div = document.getElementById('li_' + todo._id);
    var inputEditTodo = document.getElementById('input_' + todo._id);
    div.className = 'editing';
    inputEditTodo.focus();
  }

  // If they press enter while editing an entry, blur it to trigger save
  // (or delete)
  function todoKeyPressed(todo, event) {
    if (event.keyCode === ENTER_KEY) {
      var inputEditTodo = document.getElementById('input_' + todo._id);
      inputEditTodo.blur();
    }
  }

  // Given an object representing a todo, this will create a list item
  // to display it.
  function createTodoListItem(todo) {
    var checkbox = document.createElement('input');
    checkbox.className = 'toggle';
    checkbox.type = 'checkbox';
    checkbox.addEventListener('change', checkboxChanged.bind(this, todo));

    var label = document.createElement('label');
    label.appendChild( document.createTextNode(todo.title));
    label.addEventListener('dblclick', todoDblClicked.bind(this, todo));

    var deleteLink = document.createElement('button');
    deleteLink.className = 'destroy';
    deleteLink.addEventListener( 'click', deleteButtonPressed.bind(this, todo));

    var divDisplay = document.createElement('div');
    divDisplay.className = 'view';
    divDisplay.appendChild(checkbox);
    divDisplay.appendChild(label);
    divDisplay.appendChild(deleteLink);

    var inputEditTodo = document.createElement('input');
    inputEditTodo.id = 'input_' + todo._id;
    inputEditTodo.className = 'edit';
    inputEditTodo.value = todo.title;
    inputEditTodo.addEventListener('keypress', todoKeyPressed.bind(this, todo));
    inputEditTodo.addEventListener('blur', todoBlurred.bind(this, todo));

    var li = document.createElement('li');
    li.id = 'li_' + todo._id;
    li.appendChild(divDisplay);
    li.appendChild(inputEditTodo);

    if (todo.completed) {
      li.className += 'complete';
      checkbox.checked = true;
    }

    return li;
  }

  function redrawTodosUI(todos) {
    var ul = document.getElementById('todo-list');
    ul.innerHTML = '';
    todos.forEach(function(todo) {
      ul.appendChild(createTodoListItem(todo.doc));
    });
  }

  function newTodoKeyPressHandler( event ) {
    if (event.keyCode === ENTER_KEY) {
      addTodo(newTodoDom.value);
      newTodoDom.value = '';
    }
  }

  function addEventListeners() {
    newTodoDom.addEventListener('keypress', newTodoKeyPressHandler, false);
  }

  addEventListeners();
  showTodos();

  if (remoteCouch) {
    sync();
  }

})();

最佳答案

为了找到问题所在,您是否可以验证是否可以正常使用Cloudant数据库讲话,即使用命令行中的curl?使用curl,通过_id获取文档,也许是您使用Cloudant仪表板手动创建的文档。这应该可以消除身份验证的任何问题:我注意到您正在使用IAM,它并不总是简单明了的-据我所知,不受PouchDB支持(或者我上次没有看到)。
如果这是问题所在,请使用IAM + Legacy凭证创建一个新的Cloudant实例。

关于node.js - 如何使用PouchDB(leveldb)将我的 Electron 应用程序与Cloudant或其他任何支持CouchDB并同步的数据库进行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66202536/

相关文章:

node.js - 检查 MongoDB 的排队读/写

javascript - 在 Mustache 模板中转义双括号 {{ ... }}。 (在 NodeJS 中模板化模板)

javascript - 向 Node 提交 JSON 字符串时防止格式化

node.js - 无法找到 electron-prebuilt 的版本号。 - 尝试使用 Electron 重建时

javascript - Warning : flattenChildren(. ..): Encountered two children with the same key/Child keys must be unique

node.js - couchdb 自定义身份验证处理程序

node.js - Node.js 是否支持 HPKP/支持证书固定?

electron - 为什么我的 Echarts 用 Electron 配置的 index.html 不起作用?

javascript - PouchDb/CouchDb 中的递归删除?

performance - 具有层次结构性能的 DocumentDB 与键值数据库