GitHub

Getting Started Guide

如果遇到问题,请下载可用的版本 ,或查看完整的repo提交历史记录 .

在本教程中,我们将基于TodoMVC编写一个基本的Todo Web应用程序,该应用程序将同步到在线CouchDB服务器. 大约需要10分钟.

喜欢视频教程吗? 该指南以视频格式提供:

我们将从项目的模板开始,在该模板中,所有与数据相关的功能均已替换为空的存根. 下载并解压缩pouchdb-getting-started-todo.zip . 在处理XHR和IndexedDB时,最好从服务器而不是文件系统运行网页. 为此,您可以运行:

$ cd pouchdb-getting-started-todo
$ python -m SimpleHTTPServer  # for Python 2
$ python -m http.server       # for Python 3

然后访问http://127.0.0.1:8000/ . 如果您看到以下屏幕截图,那就很好了:

Todo Screenshot

打开浏览器的控制台也是一个好主意,这样您就可以看到任何错误或确认消息.

打开index.html并通过添加脚本标签将PouchDB包含在应用程序中:

<script src="//cdn.jsdelivr.net/npm/pouchdb@7.2.1/dist/pouchdb.min.js"></script>
<script src="js/base.js"></script>
<script src="js/app.js"></script>

PouchDB现在已安装在您的应用程序中,可以使用了! (在生产中,应使用脚本的本地副本.)

其余工作将在app.js完成. 我们将首先创建一个数据库来输入您的待办事项. 要创建数据库,只需使用数据库名称实例化一个新的PouchDB对象:

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

var db = new PouchDB('todos');
var remoteCouch = false;

您无需为数据库创建架构. 给它起一个名字之后,您可以立即开始向它写入对象.

我们要做的第一件事是开始将项目写入数据库. 当用户按下Enter时,主输入将使用当前文本调用addTodo . 我们可以使用以下代码完成此功能:

function addTodo(text) {
  var todo = {
    _id: new Date().toISOString(),
    title: text,
    completed: false
  };
  db.put(todo, function callback(err, result) {
    if (!err) {
      console.log('Successfully posted a todo!');
    }
  });
}

在PouchDB中,每个文档都必须具有唯一的_id . 随后使用相同的_id对文档进行的任何写入都将被视为更新. 在这里,我们使用日期字符串作为_id . 对于我们的用例,它是唯一的,也可以用于对数据库中的项目进行排序. 如果需要随机ID,可以使用db.post() . _id是创建新文档时唯一需要的东西. 您可以根据需要创建对象的其余部分.

一旦文档被写入(或写入失败), callback函数将被调用. 如果err参数不为null,则它将有一个解释错误的对象,否则result将保存结果.

We have included a helper function redrawTodosUI that takes an array of todos to display, so all we need to do is read the todos from the database. Here we will simply read all the documents using db.allDocs. The include_docs option tells PouchDB to give us the data within each document, and the descending option tells PouchDB how to order the results based on their _id field, giving us newest first.

function showTodos() {
  db.allDocs({include_docs: true, descending: true}, function(err, doc) {
    redrawTodosUI(doc.rows);
  });
}

包含此代码后,您应该可以刷新页面以查看您输入的所有待办事项.

我们不想刷新页面以查看新项目. 通常,您在向UI写入数据时会手动更新UI,但是,在PouchDB中,您可能正在远程同步数据,因此您希望确保在远程数据更改时进行更新. 为此,我们将调用db.changes ,它订阅更新的来源,无论它们来自何处. 您可以在remoteCouchaddTodo声明之间输入以下代码:

var remoteCouch = false;

db.changes({
  since: 'now',
  live: true
}).on('change', showTodos);

// We have to create a new todo document and enter it in the database
function addTodo(text) {

因此,每次对数据库进行更新时,我们都会重新绘制UI以显示新数据. live标志表示此功能将无限期继续运行. 现在尝试输入一个新的待办事项,它应该立即显示.

当用户选中一个复选框时,将调用checkboxChanged函数,因此我们将填写代码以编辑对象并调用db.put

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

这类似于创建文档,但是文档还必须包含_rev字段(除了_id ),否则将拒绝写入. 这样可以确保您不会意外覆盖对文档所做的更改.

您可以通过检查待办事项并刷新页面来测试其是否有效. 它应该保持检查状态.

要删除对象,可以使用该对象调用db.remove.

function deleteButtonPressed(todo) {
  db.remove(todo);
}

与编辑文档_rev_id_rev属性都是必需的. 您可能会注意到,我们正在传递以前从数据库读取的完整对象. 当然,您可以手动构造对象,例如: {_id: todo._id, _rev: todo._rev} ,但是传递现有对象通常更方便且更不易出错.

用户编辑文档时将调用todoBlurred . 如果用户输入了空白标题,我们将在此处删除该文档,否则将对其进行更新.

function todoBlurred(todo, event) {
  var trimmedText = event.target.value.trim();
  if (!trimmedText) {
    db.remove(todo);
  } else {
    todo.title = trimmedText;
    db.put(todo);
  }
}

现在,我们将实现同步. 您需要具有兼容的服务器实例. 您可以安装PouchDB-ServerCouchDB或使用托管的Couch服务(例如Cloudant)

要直接使用CouchDB复制,您需要确保启用了CORS. 如果您之前已设置过用户名和密码,则仅设置它们. 默认情况下,CouchDB将安装在不需要用户名和密码的"管理员"中. 您将需要用自己的主机替换myname.example.com (如果在本地安装,则为127.0.0.1:5984 ):

您可以使用curl或Futon Web界面在CouchDB中启用CORS,但我们通过制作一个名为add-cors-to-couchdb的Node脚本为您节省了一些时间. 赶紧跑:

$ npm install -g add-cors-to-couchdb
$ add-cors-to-couchdb

或者,如果您的数据库不在127.0.0.1:5984

$ add-cors-to-couchdb http://me.example.com -u myusername -p mypassword

您可以通过在浏览器中访问http:// localhost:5984 / _utils / config.html来检查是否已启用CORS. 您应该会看到以下内容:

CORS settings in CouchDB

现在,我们将待办事项列表同步. 回到app.js我们需要指定远程数据库的地址. 请记住用您自己的CouchDB实例的凭据替换userpassmyname.example.com

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

var db = new PouchDB('todos');
var remoteCouch = 'http://user:pass@myname.example.com/todos';

然后我们可以实现同步功能,如下所示:

function sync() {
  syncDom.setAttribute('data-sync-state', 'syncing');
  var opts = {live: true};
  db.replicate.to(remoteCouch, opts, syncError);
  db.replicate.from(remoteCouch, opts, syncError);
}

db.replicate()告诉PouchDB将所有文档传输to remoteCouchfrom remoteCouch . 这可以是字符串标识符或PouchDB对象. 我们称其为两次:一次是接收远程更新,一次是推送本地更改. 同样,使用live标志来告知PouchDB无限期地进行此操作. 完成时将调用回调. 对于实时复制,这意味着发生了错误,例如失去连接或取消了复制.

您应该能够在另一个浏览器中打开todo应用程序 ,并看到两个列表与您对其所做的任何更改保持同步. 您可能还需要查看CouchDB的Futon管理页面,并查看已填充的数据库.

您已经完成了第一个PouchDB应用程序. 这是一个基本示例,真实世界的应用程序将需要集成更多的错误检查,用户注册等功能.但是,您现在应该了解开始处理自己的PouchDB项目所需的基础知识. 如果您还有其他疑问,请联系IRC邮件列表 .

by  ICOPY.SITE