Node.js使用heroku临时目录和nodemailer

时间:2016-01-07 01:48:01

标签: node.js heroku fs nodemailer

我想暂时将文件保存到我的heroku文件系统,以便我可以通过电子邮件发送它们。只要电子邮件附带附件,我就不会关心文件后发生的事情。

var path = require("path");
var temp_dir = path.join(process.cwd(), 'temp/');
if (!fs.existsSync(temp_dir))
    {fs.mkdirSync(temp_dir);}

request.get({ 
      url: 'https://docs.google.com/spreadsheets/export?id='+posting.driveID+'&exportFormat=xlsx', 
      encoding: null,  // Force Request to return the data as Buffer
      headers: {
          Authorization: "Bearer "+access_token
      }
      }, function done (err, res) {
        fs.writeFile('temp/temp.xlsx', res.body, function (err) {
          console.log(err);
      })
    });
    var mailOptions={
      from : "",
      to : "",
      subject : "new download",
      generateTextFromHTML : true,
      html : "<h2>Download "+posting.title+"</h2>",
      attachments: [{
            filePath: "temp/temp.xlsx"
      }]
    };
    transporter.sendMail(mailOptions, function(error, resp){
      if(error) {
      }
      else{
        console.log("Message sent: " + resp.message);
      }
      transporter.close();
    });

我听说heroku能够托管一个/ temp目录,当dyno重新充电时会擦除它自己。我试过用它但没有运气。我收到带有temp.xlsx文档的电子邮件,但它没有内容,它已损坏。想知道nodemailer是否找不到该文件,所以它只是使用该名称。

没有关于使用heroku的文件系统的明确文档,所以我想知道我的问题在哪里。否则我可能会切换到S3。

1 个答案:

答案 0 :(得分:0)

Heroku并没有那么做。有一种方法,但它不可靠。

Heroku实例设计为只读。这样,您可以根据需要随意旋转/缩小。

Heroku的方式是:

  1. 将它们存储在内存中(如果它们仅用于该实例)
  2. 将它们存储在数据库中(如果所有实例都使用它们)
  3. 请注意,您可以将流作为附件发送。您不需要使用实际文件。

    Promotion.createIndex({ expires: 1 }, { expiresAfterSecond: 0 });
    

    http://expressjs.com/en/api.html#res.attachment