如何验证流星助手中的查询结果并重定向到 404?
How to validate query result in meteor helper and redirects to 404?
首先,我使用的不是Meteor本身,而是Angular-Meteor,所以原理是一样的。我需要做的是在 helper
函数中验证资源是否有效,并根据其结果做出决定。
我认为 find
和 findOne
集合的功能在客户端是同步的,但似乎它们不是,或者我做错了事情。
我有以下代码:
this.helpers({
post() {
let _post = Posts.findOne({
_id: this.postId
});
if( typeof _post == 'undefined' )
return this.$state.go('404');
return _post;
}
});
this.postId
来自 Url 参数。当我浏览应用程序时,一切正常。但是当我刷新页面时,定义了 this.postId
但是 Posts.find()
returns undefined
显然,它转到了 404 页面。
¿我该如何解决这种情况?
这是因为当您刷新页面时,您的视图在数据发送到客户端之前呈现。要解决此问题,您需要确保数据已准备就绪,然后再检查它是否存在。换句话说,就是检查你的订阅是否准备好了,用这段代码作为演示:
const handle = Meteor.subscribe('data');
if (handle.ready()) {
const post = Posts.findOne(/**/);
if (typeof post === 'undefined') {
console.log('post does not exist');
}
}
@Khang 关于在数据准备好之前呈现的视图是正确的。
另一种方法是使用反应变量 this.getReactively()
这是您的助手的外观:
this.helpers({
post() {
let _post = Posts.findOne({
_id: this.getReactively('postId')
});
if( typeof _post == 'undefined' )
return this.$state.go('404');
return _post;
}
});
助手将 运行 第一次 return 什么都不做(即在数据准备好之前),因此您的代码应按正常情况处理此问题(不要执行 $state.go('404')
)
记得在构造函数中声明 this.postId
,否则 getReactively()
将无法工作。
首先,我使用的不是Meteor本身,而是Angular-Meteor,所以原理是一样的。我需要做的是在 helper
函数中验证资源是否有效,并根据其结果做出决定。
我认为 find
和 findOne
集合的功能在客户端是同步的,但似乎它们不是,或者我做错了事情。
我有以下代码:
this.helpers({
post() {
let _post = Posts.findOne({
_id: this.postId
});
if( typeof _post == 'undefined' )
return this.$state.go('404');
return _post;
}
});
this.postId
来自 Url 参数。当我浏览应用程序时,一切正常。但是当我刷新页面时,定义了 this.postId
但是 Posts.find()
returns undefined
显然,它转到了 404 页面。
¿我该如何解决这种情况?
这是因为当您刷新页面时,您的视图在数据发送到客户端之前呈现。要解决此问题,您需要确保数据已准备就绪,然后再检查它是否存在。换句话说,就是检查你的订阅是否准备好了,用这段代码作为演示:
const handle = Meteor.subscribe('data');
if (handle.ready()) {
const post = Posts.findOne(/**/);
if (typeof post === 'undefined') {
console.log('post does not exist');
}
}
@Khang 关于在数据准备好之前呈现的视图是正确的。
另一种方法是使用反应变量 this.getReactively()
这是您的助手的外观:
this.helpers({
post() {
let _post = Posts.findOne({
_id: this.getReactively('postId')
});
if( typeof _post == 'undefined' )
return this.$state.go('404');
return _post;
}
});
助手将 运行 第一次 return 什么都不做(即在数据准备好之前),因此您的代码应按正常情况处理此问题(不要执行 $state.go('404')
)
记得在构造函数中声明 this.postId
,否则 getReactively()
将无法工作。