首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >节点cron作业缓存后每2秒发送一次电子邮件

节点cron作业缓存后每2秒发送一次电子邮件
EN

Stack Overflow用户
提问于 2018-03-12 14:30:22
回答 1查看 338关注 0票数 0

我正在尝试创建一个机器人,每当一个AskReddit帖子被发布到Reddit时,它都会向我发送通知。我让这个应用程序每2秒在Heroku上轮询Reddit。

问题

每次有新的帖子,都会给我发一封电子邮件。应该发生的是,新的帖子应该被缓存,直到一个新的帖子被张贴在Reddit上。取而代之的是,一封邮件每隔两秒钟发送一次新帖子;重复之前的邮件,直到一个新的帖子发布为止。

我已经尝试过的

我尝试创建一个名为latestCache的缓存变量,如下面所示,以缓存最后一篇文章。我还尝试将API调用放慢到每5秒一次。但两者都没起作用。

有人知道我哪里出问题了吗?

代码语言:javascript
运行
复制
'use strict';

const snoostorm = require('snoostorm');
const snoowrap = require('snoowrap');
const nodemailer = require('nodemailer');

// NOTE: The following examples illustrate how to use snoowrap. However, hardcoding
// credentials directly into your source code is generally a bad idea in practice (especially
// if you're also making your source code public). Instead, it's better to either (a) use a separate
// config file that isn't committed into version control, or (b) use environment variables.

// Alternatively, just pass in a username and password for script-type apps.
const r = new snoowrap({
    userAgent: 'NodeJS',
    clientId: '******',
    clientSecret: '*****',
    username: '******',
    password: '******'
});

var latestCache;

var client = new snoostorm(new snoowrap(r));


var transporter = nodemailer.createTransport('smtps://******@gmail.com:******@smtp.gmail.com');


var submissionStream = client.SubmissionStream({
    "subreddit": "AskReddit",
    "results": 1
});

submissionStream.on("submission", function(post) {
    if(post.title != latestCache.title){
        latestCache = post;

            var mailOptions = {
                from: '"Test message" <test@test.com>', // sender address
                to: '******@gmail.com', // list of receivers
                subject: 'Reddit post', // Subject line
                html: '' +
                '<table width="600" align="center" cellpadding="0" cellspacing="0">' +
                '<tr><td colspan="2"><h1>New Reddit AskReddit post from ' + post.author.name + '</h1></td></tr>' +
                '<tr><td><strong>Post Link</strong></td><td> <a href="' + post.url + '">Post Link</a></td></tr>' +
                '<tr><td>&nbsp;</td><td> <a href="http://www.reddit.com/message/compose?to=' + post.author.name + '&subject=Response+to+loan+request">Reply to loan request</a></td></tr>' +
                '</table>'
            };

            // send mail with defined transport object
            transporter.sendMail(mailOptions, function (error, info) {
                if (error) {
                    return console.log(error);
                }
                console.log('Message sent: ' + info.response);
            });
    }
});
EN

回答 1

Stack Overflow用户

发布于 2018-03-12 16:01:28

我会的

  1. 保持一个缓存超过一个过去的帖子,可能高达10-20。这样它就可以每隔一分钟就大批量地发送。
  2. 将新的post推入缓存,并触发单独的、节流的sendMail函数 const {样本量}=要求(‘送交’)允许post= [] submissionStream.on(“提交”,函数(Post){ posts.push({post}) sendMail() }) const sendMail =油门(() => { //在这里发送邮件transporter.sendMail({ subject:${posts.length} new posts submitted }) //清除缓存post= [] },2000年)
  3. 我不确定submissionStream API是如何工作的,但是如果你说它是 重复同一封邮件

然后,我只将过去的帖子标记为sent,而不是完全清除缓存,过滤掉未发送的帖子并发送这些帖子。

const sendMail = => { const postsToBeSent = posts.filter(p => ! p.sent ) transporter.sendMail({ // . }) postsToBeSent.forEach(p => p.sent= true) },2000年)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49237731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档