如何在铁路由器改变当前路由之前挂机?

时间:2015-07-22 08:22:03

标签: meteor iron-router

我在用户将文件上传到S3的表单上工作。如果用户在未验证的情况下离开表单,即使上传文件,也应取消上传文件并从S3中删除文件。

我从S3存储桶中删除文件没有问题。但是,我需要能够在用户离开当前路径(即页面)之前删除,如果下一个路由是同一页面(即页面刷新),则跳过它。

这是一个与this one on Github非常相似的问题,他们说,基本上,它无法完成。 Several other similar也存在问题,但没有一个能提供令人满意的答案。

我想检查一下是否有可能,因为在我看来这是一个至关重要的功能,我希望其他人可能已经处理过它。

如果无法完成,您会建议采取哪种解决方法?

2 个答案:

答案 0 :(得分:1)

这听起来真的很难,如果用户退出浏览器或他们的计算机失去电源怎么办?没有办法确保您可以在浏览器关闭之前在客户端上执行代码,因此您需要服务器上的某些内容。

我不知道你的整个流程,但我想你正在做一些事情,例如为新帐户上传个人资料照片&如果未创建帐户,则删除它。我建议像临时区域这样的东西。他们上传了pic&在你的数据库中你有s3 url&一个confirmed标志。 confirm标志默认为false,并在保存表单时切换。然后,您每上每周/每周都会在上传的每张新图片上运行一个cron作业。删除那些未经确认的人。

这有一个额外的好处,如果他们不小心关闭浏览器,你是一个冠军&保存了他们的进步。

答案 1 :(得分:1)

我发现了一个很好的技巧来检测用户何时离开当前页面。这是食谱:

  • 将订阅(即使为空)附加到路由控制器。这样,route loaded = subscription activeroute left = subscription stopped

  • 添加onStop()函数,并将用户离开页面时需要执行的所有服务器端代码放入其中。这是我的出版物的外观(当页面遗漏时相关表单尚未提交时我删除了上传的文件):

    Meteor.publish("files", function(sessionId) {
      var self = this;
    
      // Here I clean all the files I need to remove because the user has
      // not submitted the current form. 
      self.onStop(function () {
          console.log (sessionId + " is cleaning...");
          cleanFiles(sessionId)
      });
    
      // I look for files related to the current upload session only
      if(Users.isInRoles(this.userId, ["user"])) {
        return Files.find({"session_id":sessionId, "owner":this.userId}, {});
      }
      //and I make my publication available in case the if statement failed
      return self.ready();
    });
    

底线: 据我所知,它就像一个魅力。这是跟踪用户活动并在离开页面或子页面(我们附加订阅的模板路径)后执行代码的好方法。