我正在使用Meteor和Meteor Router在我的测试应用程序中提供路由。这是我之前问题的后续行动:Using Meteor, is it possible to have "dynamic routes?"
现在,我已经实现了在该问题中提供给我的答案。我的路线现在看起来像这样:
Meteor.Router.add({
'/:type/:name': function(type, name) {
//just checking the type and name are correct!
console.log("type: " + type);
console.log("name: " + name);
var activity = Activities.findOne({name: name});
Session.set("currentActivity", activity._id);
return 'itemPage';
},
//more entries here
});
此时,浏览器中的URL可能类似于:
http://localhost:3000/bar/someCoolBar
当我在主页面上并点击链接转到itemPage时,此代码完全正常。 Activitiy.findOne成功找到了正确的活动,我可以检索activity._id。
但是,如果我手动刷新页面或者手动输入该URL到浏览器地址栏直接转到该itemPage,我会收到以下错误:
Uncaught TypeError: Cannot read property '_id' of undefined client.js:34
Meteor.Router.add./:type/:name client.js:34
(anonymous function) router_client.js:59
(anonymous function) router_client.js:31
_.extend._compute deps.js:129
Deps.Computation deps.js:64
_.extend.autorun deps.js:255
Router._setPageFn router_client.js:23
(anonymous function) index.js:278
next index.js:166
page.dispatch index.js:169
page.replace index.js:148
page.start index.js:103
page index.js:60
(anonymous function) router_client.js:176
ready
所以我无法理解为什么这不起作用。 “type”和“name”的console.log显示正确的值,因此我认为Activity.findOne()应该按预期工作。但它没有。以上错误日志中的这一行:
Uncaught TypeError: Cannot read property '_id' of undefined client.js:34
对应我client.js的这行代码:
Session.set("currentActivity", activity._id);
这告诉我findOne没有找到结果, var activity 未定义。 为什么在点击链接时路由工作有效,而在手动输入浏览器地址栏中的URL时却没有?
谢谢!
答案 0 :(得分:1)
当Meteor最初在浏览器上加载时,没有任何可用数据,因此您需要能够考虑activity
返回null
的情况(对于之前的行)。
var activity = Activities.findOne({name: name});
因为数据仍然会从服务器下载(因此还没有_id
,因此未定义错误)
这样的事情就可以了:
var activity = Activities.findOne({name: name});
if(activity) Session.set("currentActivity", activity._id);
您还可以使用订阅回调来检查页面何时加载/加载并在页面上显示