用Dat构建应用

在这个教程中,我们将会展示如何用Dat生态系统开发应用程序。Dat的高度模块化使得Dat很适合定制开发应用程序。

Dat内置了桌面应用与命令行工具使用过的javascript API。为了定制应用、更好地掌控,你也可以分开使用Dat的核心模块。

在你的JS应用中使用Dat:

  1. require('dat'):使用Dat JS API
  2. 下面由你自己来构建!

这个教程将会带你熟悉Dat的核心模块。

Dat核心模块

这个教程将会按照分享、下载文件的步骤来进行。实际上,我们在一个高级模块——dat-node中实现了对Dat核心模块的简易操作。

任何Dat应用程序,首先要有两个基本模块

  1. 用于同步和版本化文件的hyperdrive
  2. 用来发现于连接其他peers的hyperdiscovery

Dat CLI(command line interface 命令行界面)模块将这些模块结合起来并且将他们封装在一个命令行API中。 我们还使用了dat-storage模块来处理文件和秘钥的储存。这些模块也可以被替换为一些相似的兼容模块。

开始

安装好npm 和 node 才能利用Dat构建应用。你可以通过阅读我们的开发工作流程来了解我们是如何在开发过程中管理理模块依赖关系的。

下载文件

我们的第一个模块可以从用户输入的Dat 链接下载文件。

  1. mkdir module-1 && cd module-1
  2. npm init
  3. npm install --save hyperdrive random-access-memory hyperdiscovery
  4. touch index.js

在这个例子中,我们使用random-access-momery访问我们的数据库。在你的index.js文件中需要有主模块并且将他们设置好。

  1. var ram = require('random-access-memory')
  2. var hyperdrive = require('hyperdrive')
  3. var discovery = require('hyperdiscovery')
  4. var link = process.argv[2] // user inputs the dat link
  5. var key = link.replace('dat://', '') // extract the key
  6. var archive = hyperdrive(ram, key)
  7. archive.ready(function () {
  8. discovery(archive)
  9. })

注意,用户将会在第二个参数位输入链接,从hyperdrive archive中获取文件最简单的方法是创建一个文件读取流。archive.readFile在第一个参数位接收文件名的索引数。要显示该文件,我们可以创建一个文件流并利用pipe传输到process.stdout

  1. // Make sure your archive has a dat.json file!
  2. var stream = archive.readFile('dat.json', 'utf-8', function (err, data) {
  3. if (err) throw err
  4. console.log(data)
  5. })

现在你可以运行这个模块了!从一个archive下载dat.json文件:

  1. node index.js dat://<link>

运行后你应该能看到dat.json的内容输出到了命令行。

惊喜:在Dat中展示任何文件

再加几行代码,用户就可以使用该模块从指定dat获取任何文件!

挑战:创建一个模块,允许用户输入dat链接与一个文件名,运行后该模块会输出所指定的文件,就像下面这样:

  1. var stream = archive.readFile(fileName)

写完之后你可以这样测试一下:

  1. node bonus.js 395e3467bb5b2fa083ee8a4a17a706c5574b740b5e1be6efd65754d4ab7328c2 readme.md

将所有文件下载到电脑

这个模块建立在最后一个模块的基础上。我们不再显示单个文件而是将Dat中所有文件下载到本地目录中。

我们将使用mirror-folder来将文件下载到文件系统。阅读[了解更多][read_more]mirror-folder如何与hyperdrive协同工作。

而在实践中,你应该使用dat-storage来做这件事因为这样更高效并且会将元数据保存在磁盘上。

安装过程和之前都是一样的(确保你安装了mirror-folder)。模块的第一部分也和之前的看起来一样。

  1. var path = require('path')
  2. var ram = require('random-access-memory')
  3. var hyperdrive = require('hyperdrive')
  4. var discovery = require('hyperdiscovery')
  5. var mirror = require('mirror-folder')
  6. var mkdirp = require('mkdirp')
  7. var link = process.argv[2] // user inputs the dat link
  8. var key = link.replace('dat://', '') // extract the key
  9. var dir = path.join(process.cwd(), 'dat-download') // make a download folder
  10. mkdirp.sync(dir)
  11. var archive = hyperdrive(ram, key)
  12. archive.ready(function () {
  13. discovery(archive)
  14. var progress = mirror({name: '/', fs: archive}, dir, function (err) {
  15. console.log('done downloading!')
  16. })
  17. progress.on('put', function (src) {
  18. console.log(src.name, 'downloaded')
  19. })
  20. })

运行这个模块,你应该能在download文件夹中看到我们所有的文件。

  1. node index.js dat://<link>