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

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

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

步骤 3. 发送通知除了对托管资源执行创建、替换、更新和删除操作之外,在标记事件时,该服务还会将消息发送给适当的订阅端点。该服务的第一个版本提供了电子邮件通知。接下来的几个代码段将跟踪端到端的整个过程。
可以通过信号路由来接收信号。您可以从 server.js 模块查看该信号,我们使用 signals 模块中的 processSignal 函数来处理此路由:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
app.post('/signals', signal.processSignal);

exports.processSignal = function(req, res) {
   var signal = req.body;
   console.log('Processing Signal:' + JSON.stringify(signal));

  mongo.Db.connect(mongoUri, function (err, db) {
   db.collection('subscriptions', function(err, collection) {
     collection.find().toArray(function(err, items) {
      matches = _.filter(items, function(sub){return sub.eventTitle == signal.eventTitle});
      _.each(matches, function (sub) {processMatch(sub, signal)});
      res.send(matches);
    });
  });
});




和以前一样,建立一个数据库连接,并获得相关集合的一个句柄。然后,我们通过筛选来获得与 Event 标题匹配的所有订阅。随后,通过 processMatch 函数来处理这个匹配订阅的子集的每个元素。
您是否注意到我使用了 _.filter 和 _.each?这些都来自一个名为 Underscore 的非常酷的库,该库提供了一些巧妙的辅助函数,使用过面向对象的语言(比如 Ruby)的​​用户应该对此非常熟悉。
processMatch 函数简单地为电子邮件消息分配了适当的值,并调用了 mailer.sendMail 函数:
1
2
3
4
5
6
7
8
9
10
function processMatch(subscription, signal) {
   opts = {
      from:'Simple Notification Service',
      to: subscription.alertEndpoint,
      subject: subscription.eventTitle + ' happened at:' + new Date(),
      body: signal.instancedata
   }
   // Send alert
   mailer.sendMail(opts);
}




sendMail 函数也非常直观,因为我使用了名为   的另一个库。您可以看到,我的 sendMail 函数只使用了一些 NodeMailer 功能来发送电子邮件通知。从根本上讲,它使用了一些身份验证值来初始化传输对象,然后指定消息内容(主题、正文、地址等),并开始发送:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
exports.sendMail = function (opts) {
   var mailOpts, smtpTransport;

   console.log ('Creating Transport');

   smtpTransport = nodemailer.createTransport('SMTP', {
      service:'Gmail',
      auth:{
         user: config.email,
         pass: config.password
      }
});

// mailing options
mailOpts = {
   from: opts.from,
   replyTo: opts.from,
   to: opts.to,
   subject: opts.subject,
   html: opts.body
};

console.log('mailOpts:', mailOpts);

console.log('Sending Mail');
// Send mail
smtpTransport.sendMail(mailOpts, function (error, response) {
   if (error) {
      console.log(error);
   }else {
      console.log('Message sent:' + response.message);
   }
   console.log('Closing Transport');
   smtpTransport.close();
   });

}




步骤 4. 测试应用我已经介绍了通知服务的主要功能。接下来,我将快速介绍自动化测试。
Node.js 生态系统中的另一个巧妙的框架是用于测试的 Mocha。结合使用 Mocha 与附加项(比如 supertest 用于 HTTP,should 用于断言),为 API 提供可读的功能测试。以下是来自 eventtests.js 模块的片段,用于验证 readbyid Event API:
1
2
3
4
5
6
7
8
9
10
11
12
13
it('should verify revised News flash 6 event', function(done) {
   request(url)
      .get('/events/'+ newsFlash6id)
      .end(function(err, res) {
         if (err) {
            throw err;
         }
         res.should.have.status(200);
         res.body.should.have.property('title');
         res.body.title.should.equal('News flash 6 - revised');
         done();
      });
});




这个语法和格式具有非常好的可读性,我希望它会比较容易维护。
我的自动化功能回归测试套件包括每个 API 的测试,我已经建立了一个测试文件夹,其中包括所有测试。Mocha 承认这一惯例。要运行测试套件,可从项目的根发出命令 mocha。
如下图所示,如果没有失败,测试套件的输出应该非常简洁:
我目前要做的是在本地运行这个回归测试套件,(通常)在我做了修改时会执行此操作。我总是在推送变更之前运行它,以实现源代码控制。该服务的其中一个实例在 IBM 新的 BlueMix 平台上运行,如果您单击了 Run the app,就已经与此实例进行了互动,而且您还会看到一个最近的事件信号的日志。
目前,我实际上有两个环境:一个是我的本地开发系统,我在上面执行修改操作并执行测试,另一个环境是 BlueMix 上的生产系统。这样的安排目前运作良好,但我的下一个步骤是在 BlueMix 上创建另一个托管的临时环境。新的临时环境让我可以在更接近生产的环境中运行回归套件,并在修改源代码后,在生产环境中开放自动测试和部署等选项。当我迈出这一步时,我一定会在博客上记录这一切。
您可以考虑构建一个类似的、简单的通知服务,用大量的工具来管理事件。尝试一下,并让我们知道您的尝试结果!
返回列表