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

How to hook before iron-router changes the current route?

我处理一个表单,我的用户将文件上传到 S3。如果用户在没有验证的情况下离开表单,即使上传了文件,也应该取消文件上传并从 S3 中删除文件。

我可以毫不费力地从我的 S3 存储桶中删除文件。但是,我需要能够删除它们 before 用户离开当前路由(即页面),如果下一个路由是同一页面(即页面刷新)则跳过它。

这个问题与 this one on Github where they say that, basically, it can't be done. other similar 中的问题也非常相似,但是 none 提供了令人满意的答案。

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

如果无法完成,您会建议什么解决方法?

这听起来很难,如果用户退出浏览器或他们的计算机断电怎么办?无法确保您可以在浏览器关闭之前在客户端上执行代码,因此您需要在服务器上执行一些操作。

我不知道你的整个流程,但我想你正在做一些事情,比如为新帐户上传个人资料照片,如果没有创建帐户,则将其删除。我会推荐类似暂存区的东西。他们上传图片,在你的数据库中你有 s3 url 和 confirmed 标志。确认标志默认为 false,并在保存表单时切换。然后,您 运行 每隔 hour/day/week 对每张上传的新图片进行一次 cron 作业,并删除那些未确认的图片。

这还有一个额外的好处,就是如果他们不小心关闭了浏览器,您就是冠军并保存了他们的进度。

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

  • 将订阅(即使是空的)附加到您的路由控制器。这样,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();
    });
    

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