Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Nodejs中发送多封邮件_Javascript_Node.js_Asynchronous_Mandrill - Fatal编程技术网

Javascript 在Nodejs中发送多封邮件

Javascript 在Nodejs中发送多封邮件,javascript,node.js,asynchronous,mandrill,Javascript,Node.js,Asynchronous,Mandrill,我正在开发的一个web应用程序将每三个月向客户发送一次发票。这将是一个在午夜运行的预定事件,但是在开发中,我把这个代码放到一个路由中,这样我就可以测试它。p> 简而言之,我希望代码执行以下操作 从数据库查询所有未发送的发票 为每个发票调用Mandrill(在这个调用中,我还调用了一个函数,从发票创建Mandrill消息对象) 对于Mandrill发送的每条消息,更新数据库发票sent:true 发送所有发票后,在async.fallet 下面的代码可以工作。但是我对\每个都有一些担心 invoi

我正在开发的一个web应用程序将每三个月向客户发送一次发票。这将是一个在午夜运行的预定事件,但是在开发中,我把这个代码放到一个路由中,这样我就可以测试它。p> 简而言之,我希望代码执行以下操作

  • 从数据库查询所有未发送的发票
  • 为每个发票调用Mandrill(在这个调用中,我还调用了一个函数,从发票创建Mandrill消息对象)
  • 对于Mandrill发送的每条消息,更新数据库发票
    sent:true
  • 发送所有发票后,在
    async.fallet
  • 下面的代码可以工作。但是我对
    \每个
    都有一些担心

    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
    。。。。但是我不知道怎么写。 我不知道应该将限制设置为什么,但我想几个并行请求比像上面那样在serie中运行所有mandrill请求要好,我错了吗编辑
    \每个
    并行运行回调。与
    async.each
    的区别在于我没有得到“最终回调”

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

    我认为您可以使用该函数


    它也将并行执行查询

    是的,但我认为在向邮件服务发送请求时有一个很好的限制理由。因此,我的应用程序不会淹没服务器的请求,并被阻止/忽略或类似。但我真的不知道这是否必要。。。是吗?:)FWIW mandrillilapi文档没有特别提到速率限制错误,但是有关于他们每小时发送配额如何工作的问题。所以我想您应该可以只使用
    each()