如何等待函数完成,然后在onBeforeAction中调用this.next()



在我的onBeforeAction方法中,我需要等待函数完成,然后调用this.next().

Router.onBeforeAction(function () {
var self = this;
functionToWait(function () {
// Success callback
self.next(); 
});
});

但onBeforeAction似乎是在函数之前完成的,因此当我调用self.next()时,它会抛出一个异常。


我在这里问了一个类似的问题,但我的问题没有解决。

如何让onBeforeAction调用在metro.js中等待内部函数调用完成?

需要做的是网站需要身份验证。Session中存储了一个用于此目的的令牌。我想实现的是,每当路由发生更改时,都需要验证令牌。我正在尝试在onBeforeAction中进行此验证。来自iron-router的新API表示,我需要在此方法中调用this.next()。但问题是onBeforeAction方法在验证之前完成了运行。因此,在验证的成功回调中,调用self.next()将抛出异常。

我尝试过的:

  1. 编写一个处理程序,告诉onBeforeAction等待验证完成,然后继续,但我之前问题的答案给了我一个无限循环,我不知道如何解决它。

  2. 创建会话变量tokenValidated,在clientStart上运行validtion。并在成功回电中设置为true。并在onBeforeAction中检查此变量。

此解决方案的问题是,当您尝试刷新页面时,它将不起作用,原因与onBeforeAction在验证之前完成的原因相同。

  1. 在验证成功回调中直接调用onBeforeAction

这在登录后有效,但首次访问网站时不受保护。

  1. 像这个一样直接等待会话变量tokenValidated

    this.wait(Meteor.subscribe('token',Session.get('token Validated'));

并检查是否已准备好

if (this.ready()) // proceed

而且它似乎也不起作用。

身份验证令牌由以下命令存储:

Session.setPersistent('authToken');

以便将其存储在localStorage中。我试图实现的行为是:

  1. 每当新会话启动时,请验证此authToken,并将其状态设置为True/Fasle。

  2. 在BeforeAction中检查此状态,然后相应地继续。

  3. 此状态需要在BEFOREonBeforeAction上准备就绪。

我的问题是验证调用了一个服务器方法,返回状态需要时间,而且我找不到方法告诉onBeforeAction等待验证。

以下是我解决这个问题的方法。

我没有在onBeforeAction中验证身份验证令牌,而是在client.js中这样做:

Meteor.startup(function () {
// Validate authentication token here
Meteor.call('validateAuthToken', Session.get("authToken"), function (error, result) {
if (!result) {
Router.go('/login');
} else if (!Router.current().route.getName()) {
// Site init from root, token is validated, direct to notepage
Router.go('/notepad');
}
});
});

最新更新