在Nodejs中发送多个邮件

时间:2014-09-11 16:29:19

标签: javascript node.js asynchronous mandrill

我建造的网络应用程序将每三个月向客户发送一张发票。这将是一个在半夜运行的预定事件,但在开发中我已将此代码放入路由中,以便我可以测试它。

简而言之,我希望代码能够执行以下操作。

  1. 从DB中查询所有未发送的发票。
  2. 为每张发票打电话给Mandrill(在此电话会议中,我还调用了一个从发票创建Mandrill消息对象的功能)。
  3. 对于Mandrill发送的每封邮件,请更新数据库发票sent: true
  4. 发送完所有发票后,请在async.waterfall
  5. 中进行最终回调

    以下代码有效。但我对_.each有些担忧。

    invoices.post('/invoices/send/', function(req, res, next) {
    
        async.waterfall([
            // Query all unsent invoices
            function(callback) {
                db.invoices.find({sent: false}).toArray(callback);
            },
    
            // Send all unsent invoices
            function(invoices, callback) {
                if (invoices.length === 0) {
                    var err = new Error('There are no unsent invoices');
                    err.status = 400;
                    return next(err); //Quick escape if there are no matching invoice to process
                }
    
                // Make a call to Mandrill transactional email service for every invoice. 
                _.each(invoices, function(invoice) {
                    mandrillClient.messages.sendTemplate({template_name: "planpal-invoice", template_content: null, message: mandrillClient.createInvoiceMessage(invoice)}, function(sendResult) {
                        console.log(sendResult);
                        db.invoices.updateById(invoice._id, {$set: {sent: true}}, function(err, saveResult) {
                            console.log(saveResult);
                        });
                    }, function(err) {
                        return next(err);
                    });
                });
    
                callback(null, 'done');
            }
        ],
        function(err, result) {
            if (err) {
                return next(err);
            }
            res.json(result);
        });
    });
    

    我认为我应该使用async.eachLimit而不是......但我不知道如何写它。 我不知道我应该设置限制,但是我猜几个并行请求比在上面的系列中运行所有mandrill请求更好,我错了吗? EDIT _.each并行运行回调。与async.each的区别在于我没有得到#34;最终回调"

    结论:我应该使用上面的async.eachLimit吗?如果是,那么什么是良好的限值?

1 个答案:

答案 0 :(得分:1)

我认为您可以使用https://github.com/caolan/async#each功能。

它也将并行执行查询