gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:37:16 25 4
gpt4 key购买 nike

我正在使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com