我对Meteor.js框架中的mongo很新.在这里,我使用它的ID查询了一个MongoDB对象.我正在尝试访问属性"mana",但它返回我未定义.
var skill = Skills.find({_id:Session.get("selected_skill")});
alert(skill);//This returns me "undefined"
Skills.update(Session.get("selected_skill"), {$inc: {mana: 1}});
Run Code Online (Sandbox Code Playgroud)
你能告诉我关于在mongo中访问meteor属性的要求吗?谢谢
find方法返回一个游标,而不是对象和数组.要访问对象,您需要从光标中获取它
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
Run Code Online (Sandbox Code Playgroud)
或直接获得findOne:
var skill = Skills.findOne(Session.get('selected_skill'));
Run Code Online (Sandbox Code Playgroud)
然后你可以像任何其他js对象一样使用它:
console.log(skill.mana);
skill._cache = {cooldown: true};
Run Code Online (Sandbox Code Playgroud)
请记住,在客户端,收集方法就像find非阻塞一样.它们返回Meteor在缓存中的任何内容,而不一定是服务器端db中的内容.这就是为什么你应该总是在一个被动的上下文中使用它们,或者确保在执行之前已经获取了所有数据(在你熟悉Meteor之前不要担心后者,从第一种方式开始).
此外,您需要记住,因为这样,findOne并且find.fetch可能返回null/清空数组,即使相应的元素在db中(但尚未缓存).如果您在反应函数中没有考虑到这一点,那么您将遇到错误.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Run Code Online (Sandbox Code Playgroud)
如果我们没有从函数中逃脱if(!article),表达式article.title将在第一次计算中引发错误,因为article未定义(假设它之前没有缓存).
如果要从客户端更新数据库,则一次只能更改一个项目,并且必须按其引用该项目_id.这是出于安全原因.你的这条线是好的:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
Run Code Online (Sandbox Code Playgroud)
alert()是一个函数,无论你喂它什么,它都会返回 undefined.
alert(42); // -> undefined
Run Code Online (Sandbox Code Playgroud)
一般来说,这是远远更好地与调试console.log比alert.
| 归档时间: |
|
| 查看次数: |
4046 次 |
| 最近记录: |