【问题标题】:How to hook before iron-router changes the current route?在iron-router改变当前路由之前如何hook?
【发布时间】:2015-08-02 02:09:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: meteor iron-router


    【解决方案1】:

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

    我不知道您的整个流程,但我想您正在执行诸如上传新帐户的个人资料图片之类的操作,如果未创建该帐户,则将其删除。我会推荐一个像集结区这样的东西。他们上传图片并在您的数据库中拥有 s3 url 和 confirmed 标志。确认标志默认为 false,并在保存表单时切换。然后,您每小时/每天/每周对每张上传的新图片运行一次 cron 作业,并删除未确认的图片。

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

    【讨论】:

    • 我计划在服务器上运行一个 cron 作业来处理我无法跟踪进程中止的情况,但我希望这些情况“罕见”到足以让我使用大型周期性 cron 作业(即每周)。但是,将其系统化并将其周期减少到 24 小时就可以解决问题,而且它比铁路由器解决方案要简单得多。更不用说它不应该是这样的负担。 “可恢复”功能使它变得更好,我没有想到 :-) 我会验证你的答案。谢谢!
    【解决方案2】:

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

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

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

    【讨论】:

    • 如果我错了,请纠正我,但是如果客户端暂时失去了 websocket 连接,那么这将执行。这意味着如果用户的 wifi 中断几秒钟,他就会失去进度。
    • @Matt K,我吓坏了一分钟。我只是做了几次尝试,它并没有立即触发 onStop。在上传完全失败之前有 30 秒的延迟。如果我在 10 秒内重新连接,上传会继续。如果我在 10 到 30 之间做,它会重新启动。 30 秒后,我收到“上传失败”错误消息。仅供参考,我使用 slingshot 包进行上传。
    • onStop() 触发,如果我不重新连接,延迟 42 (?) 秒后。这是我一收到套接字错误ERR_ADDRESS_UNREACHABLE
    • 那么如果他们上传图片成功然后断开连接43秒,他们重新连接时该图片是否被删除?
    • 是的,如果表单尚未提交。当用户返回时,用户界面显示反馈“上传失败”。我同意这并不理想,但这只是一个早期版本。我可能会为我生成的上传会话 ID 加上时间戳,并防止其文件被删除,直到它过期或用户回来。这应该使它更有用。但是,对我来说,这似乎是一个极端案例(并不是我不想处理它)。
    猜你喜欢
    • 2015-03-14
    • 2014-10-21
    • 2015-08-26
    • 2015-04-06
    • 2021-02-06
    • 2015-08-24
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    相关资源
    最近更新 更多