首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Node.js 和 MongoDB 构建一个简单的通知服务(1)

使用 Node.js 和 MongoDB 构建一个简单的通知服务(1)

您是否曾试图协调一组不断增加的各种工具的行为,以便创建一些较大的系统?就我而言,我们的开发团队需要组装一个持续交付管道,并对其操作进行排序。实现此操作的一个选择是使用一个支持创建、标记和订阅事件的通知服务。
可以应用这样的服务来构建一个系统,宣布新版本的可用性。然后管道的下游组件才可以接收通知,并根据新版本的出现来采取行动。行动可能包括主动配置新的测试系统和运行回归测试套件。
“通知服务并不是必须包含令人兴奋的消息才是有用的通知服务。”

我开发了一个简单的通知服务,使用 Node.js 运行时作为对利用 RESTful API 快速开发 HTTP 服务器的支持。我还选择了使用 MongoDB 作为后端。其面向文档的特性对于快速开发原型似乎是完美的,我不必提供对 ACID(原子性、一致性、隔离性和持久性)属性的严格支持。
要了解如何实际创建通知服务,请单击 Run the app 来检索由通知服务处理的最近五个事件信号的日志。您看到的大多数信号都是由我们的产品构建系统生成的,而且都是 JSON 格式的。

构建类似应用程序的要求
  • 对   和 Node.js 开发环境有基本的了解
  • 拥有以下这些 Node.js 模块: 、  和
  • 用于自动化测试的其他模块: 、  和
  • 一个   NoSQL 数据库
在安装 Node 和 MongoDB 之后,您就可以使用 Node 的包管理器(npm)来加载所需的依赖关系。请参见从 JazzHub 下载的代码中的 package.json 文件,了解支持这个应用程序的模块和框架的具体版本。
让我们开始吧!
步骤 1. 创建 API该 API 与 REST 类似,资源的访问和修改都是通过使用惟一 URL 来完成的,这些 URL 应用了以下 HTTP 动词的:GET、PUT、POST 和 DELETE。使用 HTTP 消息功能的任何应用程序都可以访问该服务。这种方法为将来的基于浏览器的工具提供了一个干净的界面。
由该服务管理的主要资源是事件和订阅。一个 API 可用于每个创建、读取、更新和删除操作。
我基于 Express 框架来构建这个 API,因为该框架包含一个强大的 Web 应用程序开发特性集,而且只需要遵循惯例,就能非常轻松地使用它。让我们来看一看应用程序的主 server.js 模块中的以下代码,该应用程序用于设置定向到这些事件的传入请求的路由:
1
2
3
4
5
6
console.log ('registering event routes with express');
app.get('/events', event.findAll);
app.get('/events/:id', event.findById);
app.post('/events', event.addEvent);
app.put('/events/:id', event.updateEvent);
app.delete('/events/:id', event.deleteEvent);




然后,可以为订阅重复相同的基本模式:
1
2
3
4
5
6
console.log ('registering subscription routes with express');
app.get('/subscriptions', sub.findAll);
app.get('/subscriptions/:id', sub.findById);
app.post('/subscriptions', sub.addSubscription);
app.put('/subscriptions/:id', sub.updateSubscription);
app.delete('/subscriptions/:id', sub.deleteSubscription);




除了针对事件和订阅的这些基本动作之外,还有另外两个重要的 API,具体为:
  • 一个用于标记事件的 API:
    1
    app.post('/signals', signal.processSignal);




  • 一个用于检索最近的信号的 API:
    1
    app.get('/signallog', signallog.findRecent);




步骤 2. 使用后端MongoDB 提供了服务的持久存储。我直接使用后端文档(集合),而不是使用一个对象映射器。Node.js 原生驱动程序提供了所需的全部功能。
两个主要的资源(事件和订阅)被直接映射到数据库集合。用户可以直接访问它们。例如,像前面的代码段定义的那样,对事件资源的 GET 请求会产生对 event.findAll 的调用。findAll 函数是在 events.js 模块中定义的:
1
2
3
4
5
6
7
8
9
10
exports.findAll = function(req, res) {
   mongo.Db.connect(mongoUri, function (err, db) {
      db.collection('events', function(er, collection) {
         collection.find().toArray(function(err, items) {
            res.send(items);
            db.close();
         });
      });
   });
}




findAll 函数简单地连接到数据库,获得事件集合的一个句柄,并返回所有元素,然后关闭连接。所有 API 请求都以这种类似的非常直接的方式进行处理。在下面的示例中,删除事件请求由 events.js 模块中的 deleteEvent 函数处理:
1
2
3
4
5
6
7
8
9
10
11
12
exports.deleteEvent = function(req, res) {
   var id = req.params.id;
   mongo.Db.connect(mongoUri, function (err, db) {
      db.collection('events', function(err, collection) {
         collection.remove({'_id':new BSON.ObjectID(id)}, {safe:true}, function(err,
result) {
            res.send(req.body);
            db.close();
         });
      });
   });
}




和前面一样,建立一个连接,并获得某个集合的句柄。然后,根据所提供的 ID 来删除集合元素,并关闭连接。
返回列表