学习如何在 Bluemix 上创建一个 Cloudant NoSQL 数据库,并将其添加到您的 Node.js Web 应用程序中。探索构建一个数据驱动、动态生成的网络商店,该商店会根据当前库存水平来改变外观。使用基于 Web 的 Cloudant 仪表板查看和维护您的 NoSQL 数据库。
本教程是 developerWorks 上的 “Bluemix 基础” 教程系列的一部分。
第 3 步. 创建 Cloudant NoSQL DB 服务并将其绑定到应用程序
第 5 步. 使用 nano 将数据添加到 Cloudant NoSQL 数据库中
恭喜您, — 您已经完成了 Bluemix 基础知识的学习!
在前一篇教程 “将大量服务添加到您的应用程序中” 中,您已经了解到,服务只是 Bluemix 或第三方合作伙伴托管的代码,它们可以给您部署的 Bluemix 应用程序增添价值。
服务给您的应用程序带来了强大的功能,比如数据库、移动应用程序支持、分析、遗留系统集成和安全管理。从某种意义上讲,它们就像是插件,您随时可以向应用程序添加和绑定服务。
在可用的 Bluemix 服务中,数据库服务是最常使用的。而 Cloudant NoSQL DB 服务是最流行的 Web 应用程序附加功能之一。
为经典的三层架构设计的大部分 Web 应用程序都在第三层需要一个数据库服务:
您的应用程序逻辑在无状态的应用程序层运行,而数据存储在数据库层。此架构使您只需增加应用程序实例的数量,就可以将应用程序扩展到越来越多的用户。
本教程将快速概述如何使用 Bluemix,将一个 Cloudant NoSQL DB 服务添加到您的 Bluemix 应用程序中。
您将创建 Cloudant 服务的一个实例,并将它绑定到您的 Web 应用程序。然后您将创建一个数据库,将一个包含应用程序数据的文档插入到该数据库中 — 从您的桌面远程插入。您将了解 Web 应用程序如何能够根据数据库中的数据来动态改变外观。最后,您将使用 Bluemix 上基于 Web 的 Cloudant 仪表板,用它作为访问您的数据的替代方式。
cf api https://api.ng.bluemix.net/
cf login
cf push your-app-name
为应用程序选择的名称必须在 Bluemix 上是唯一的;换句话说,它不能被其他任何 Bluemix 用户使用。如果该名称(称为 “route”)已被使用,您将得到一个错误。
Bluemix 上的 Cloudant NoSQL DB 服务提供了 Cloudant 实例,您可以在您的应用程序中绑定这些实例并立即使用它们。目前的共享计划是一个实例,它每月免费提供至多 2 GB 传输空间和 50,000 次 API 调用;付费选项允许无限量的传输和 API 调用。
请注意,该共享计划实际上是一个付费计划,但是,如果您的每月传输和 API 配额符合条件,它就是免费的。
cf create-service cloudantNoSQLDB shared laurenlandscapesdb
cf bind-service your_app_name laurenlandscapesdb
cf restage your_app_name
如果重新加载您的浏览器,您会注意到网络商店中仍然没有印刷品。即使数据库服务现在已经绑定到了应用程序,您仍然需要创建一个数据库并添加数据。这将在第 5 步中完成。
查看代码文件和目录;该结构应与之前的教程类似。
应用程序的操作也应该是类似的。让我们来复习一下,对 Lauren's Lovely Landscapes 商店的一个页面的每个 Web 请求由代码路由到 views 目录中的某个模板。路由到一个模板时,代码就会附加一个包含网站标题信息的 JavaScript 对象。该模板使用此对象呈现它的标题(“Lauren's Lovely Landscapes”)。
您会注意到一个主要区别:每个印刷品的模板(alaska.jade、australia.jade、antarctica.jade)不再存在;现在有一个数据驱动的 printdisp.jade 模板来处理照片印刷品细节和定价的显示。
该代码现在前进到以下两个模板中的一个:home.jade 或 printdisp.jade。针对网络商店主页的请求将被转发,而且会将从数据库中检索到的印刷品数组附加到 home.jade。然后,home.jade 根据可用的印刷品来生成主页。
如果用户选中任何可用的印刷品,代码会将传入的请求转发给 printdisp.jade,并向请求附加所选印刷品的信息。然后 printdisp.jade 会动态地生成该印刷品的标题、jpg 引用、描述和价格。
让我们试一下。首先,您需要创建一个数据库,并将印刷品库存信息添加到其中。
nano 是一个用于 Apache CouchDB 的非常简单的 Node.js 库。Bluemix 上的 IBM Cloudant NoSQL DB 服务提供了一个兼容 CouchDB 的 API,可以使用 nano 直接访问该数据库。
cf env your-app-name
这将显示可供已部署的应用程序使用的环境变量。绑定的 Cloudant NoSQL DB 服务的信息将显示在 VCAP_SERVICES 中。查找以下类似代码:
"VCAP_SERVICES": { "cloudantNoSQLDB": [ { "credentials": { "host": "88396eb3-c56d13d6593-bluemix.cloudant.com", "password": "3f7c34a", "port": 443, "url": "https://sfsfsabluemix:sfsfasfsa@8-8400-ec56d13d6593-bluemix.cloudant.com", "username": "232-bluemix" }, …
记下服务凭据的 url 值。您接下来需要使用它。
npm install
node dataseeder.js
此代码将执行以下操作:
对于这个网络商店应用程序,inventory 文档中的每个 landscapes 数组元素都拥有以下字段:
成功完成上述操作后,您会看到与以下代码类似的输出:
all records inserted. { ok: true, id: 'inventory', rev: '1-df83420e7c2fb757a5fb3de7c290d675' }
当然,您的文档修订版 ID 将会有所不同。
您已经创建了库存数据库。查看 dataseeder.js 中的代码:它使用 nano 库访问您的 Cloudant NoSQL DB 服务,而且很容易理解。
不同于 dataseeder.js,您会注意到可以找到 app.js,而且它被连接到 Cloudant NoSQL 数据库实例,您无需在其代码中修改数据库 URL。这是因为在 Bluemix 下运行时,app.js 会读取和解析 VCAP_SERVICES 环境变量,从凭据中提取该 url。
您现在应能看到商店中已有的印刷品。但是,您会注意到,Australia 印刷品使用红色突出显示,而且无法选中它;这是因为该印刷品已脱销。如果查看 dataseeder.js 中的代码,您会看到 Australia 印刷品的数量被设置为 0。
在最后一步中,假设一批新的 Australia 印刷品已到货,您将更新数据库中的可用数量。您会看到该网站在动态地发生更改,以包含新到货的商品。
当然,您可以编写一个类似 dataseeder.js 的程序来更改 Australia 印刷品的数量。但是,在这一步中,您将使用一个基于云的 Cloudant 仪表板来手动执行更新。Cloudant 仪表板对管理、查看和操作 NoSQL 数据库中的数据很有用。
each item in prints if item.quan > 0 .preview a(href='printdisp?id=#{item.id}') | #{item.title} br img.thumb(src='/static/images/#{item.imgsrc}') else .preview.outofstock a.outofstock(href='printdisp?id=#{item.id}') | #{item.title} - i small | out of stock br img.thumb(src='/static/images/#{item.imgsrc}')
除了 Cloudant NoSQL DB 服务之外,Bluemix 还提供了许多有趣的服务,它们可给您的应用程序增添价值和特性。例如,IBM Watson 的许多学习和认知功能 现在都能够以 Bluemix 服务的形式提供。您可能想浏览 Bluemix 服务目录,想象您可添加到已部署的 Web 应用程序中的所有新特性。
测试您在本教程中学到的知识。答案在下方。
1. b,2. d,3. b,4. b,5. b
在本教程中,您:
本教程是 developerWorks 上的 “Bluemix 基础” 教程系列的最后一篇!如果您已经完成了所有这些教程,那么您已经出师了!
要获取稳定的教程和技术资源流来帮助您继续使用 Bluemix 进行学习、开发和连接,请参阅 developerWorks 上的 Bluemix 页面。