我有一个从S3提供的Ember.js应用程序,使用ember-cli-deploy上传。它有一个Rails后端,我不时会进行维护。在此期间,我希望我的ember应用程序将每个路由重定向到“正在维护”页面。
我可以在Ember框架内执行此操作,还是最好暂时用静态文件替换S3上的index.html?
答案 0 :(得分:2)
嗯,最简单的方法就是你建议的方式(替换索引)。但是,如果您愿意,我可以为您提供另一种方案,但需要一些时间来实施。
使用beforeModel()
我不确定您使用的是否用于身份验证和授权,但是,这可以帮助您。例如,您可以获得需要由Token验证的Session(在我的情况下来自Server),如果它无效,我会将每个人重定向到现在登录的单个页面,但您可以将其更改为UC。
// route/login.js // this can be in other page as well
import Ember from 'ember';
export default Ember.Route.extend({
session: Ember.inject.service(),
beforeModel() {
if(this.get('session.isAuthenticated')) {
this.transitionTo('index'); // as you can see if session is authenticated I will redirect it to index but if not all pages will remain in the same page which is login.
}
}
});
所以在你的application.js中你很容易
this.get('session')
然后您可以授权它,如果没关系,那么您可以将用户重定向到适当的页面,但如果不是,您可能希望将其重定向到其他位置。
请记住,如果您想使会话无效,您可以轻松使用
session.invalidate();
简而言之,您可以轻松地使您的令牌API或您从服务器发送到Ember应用程序的任何内容无法访问,因此Ember无法解析它将重定向到另一个页面。
希望我能正确解释,你理解我的意思。
答案 1 :(得分:1)
您可以在Ember应用程序中完成一些工作。
如果您的API服务器返回可识别状态,请说503
code,您可以使用API调用规则使用路由maintenance
重定向到actions
路由,或者使用已加载的内容。
这允许您的Ember应用程序为具有静态或缓存数据的页面提供服务,以便无缝浏览,从而改善用户体验。
当然,如果您的停机时间相当短(几秒钟),这很好。
SEO明智的是,如果您还想让蜘蛛暂时无法使用内容,您可能需要在Web服务器上设置自定义规则(nginx,apache ...)。这也避免了加载整个Ember堆栈。
答案 2 :(得分:0)
创建一个初始化程序,该初始化程序重新打开Ember.Route并转换为beforeModel挂钩中的“停机维护”路由(在调用super之前):
import Ember from 'ember';
var initialize = function(/* container, app */) {
Ember.Route.reopen({
beforeModel: function() {
this.transitionTo('down-for-maintenance');
this._super();
}
});
};
export default {
name: 'maintenance-redirect',
initialize: initialize
};
完成后将其删除。