【问题标题】:Use session in Heroku scheduler在 Heroku 调度程序中使用会话
【发布时间】:2016-08-04 19:27:57
【问题描述】:

我希望能够延迟在我的 heroku/nodejs 应用上发送电子邮件。 我知道如何使用 Heroku Scheduler 来延迟任务。 然后我可以检索需要为哪个用户发送哪些电子邮件。 但要使用 Gmail API,我需要检索经过身份验证的用户会话,但我不知道该怎么做。 我正在使用 pg 来存储会话,但我不相信它会是具体的:

    app.use(session({
        secret: 'xxx',
        store: new pgSession({
            conString: config.db.url
        }),
        resave: false,
        saveUninitialized: false,
        cookie: { maxAge: 24192000000 }
    }));

【问题讨论】:

  • 要使用Gmail API 发送电子邮件,在提示登录Google 后需要用户的OAuth 令牌。你不保存那个吗?一旦你有了它,只要它没有过期,你就可以稍后发送电子邮件。
  • 您在此处显示的会话模块,为您的应用存储经过身份验证的用户会话。如果您已经存储了需要为哪个用户发送哪些电子邮件,则不必担心这一点。
  • @RahatMahbub 我认为他是在说他不知道如何通过 user_id 检索特定会话。

标签: node.js session heroku scheduled-tasks gmail-api


【解决方案1】:

高级

在某些时候,您的路由链中有一个函数触发了延迟的电子邮件,您应该只在任务寄存器中包含会话(来自req.session)。从那里只需确保您可以使用正确的用户数据来发送电子邮件(也就是会话数据中的 user_id 或 user_email)。

更详细

您需要考虑一下您的中间件是如何处理这个问题的。

app.use(session({ 等将添加一个session 对象到您的req 对象。在您的路线中的某处,在调用 app.use (session) 部分之后,您正在处理另一个功能(例如登录或注册)。因此,对于 Gmail,您正在向 Gmail api 调用 Oauth 请求。他们将向您返回一个用户访问令牌,您可以使用它来获取他们的用户数据(例如电子邮件地址)。从那里,您可以将他们的用户数据附加到您的 req.session 对象。

一个简单的例子(修改以供您使用)

app.use(session({
  secret: 'xxx',
  store: new pgSession({
    conString: config.db.url
  }),
  resave: false,
  saveUninitialized: false,
  cookie: { maxAge: 24192000000 }
}));

app.post('/register', function(req, res, next) {
  // You'll have to write your own google client implementation :)
  var token = getGoogleAccessToken();

  // Again, left to you to write.
  var user_email = fetchUserGoogleEmail( token ); 

  var session = req.session;
  session.email = user_email;
  // Register heroku delayed task with session data.

  // Save user data and create account, etc.
});

【讨论】:

    【解决方案2】:

    我使用下面的代码来做类似的事情

    var email = require("emailjs");
    var server = email.server.connect({
        user: "user@gmail.com",
        password: "password",
        host: "smtp.gmail.com",
        ssl: true
    });
    
    var cron = require('node-schedule');
    
    cron.scheduleJob({hour: 2, minute: 30, dayOfWeek: 0}, function() {
    
        server.send({
            text: "i hope this works",
            from: "you <user@gmail.com>",
            to: "reciever <reciever@gmail.com>",
            subject: "My Email Subject"
        }, function(err, message) {
            //error handling
        });
    
    });
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多