尝试获取平均评级时出错模板助手中出现异常:TypeError:无法读取属性'评级'为null

getting error when trying to get average rating Exception in template helper: TypeError: Cannot read property 'rating' of null

本文关键字:TypeError null 异常 读取 属性 评级 获取 出错      更新时间:2023-09-26

我有两个集合recipes和reviews,用户可以查看一个recipe,并可以对其进行从1到5的评分,我正在尝试获得recipe的平均评分,但出现了错误模板助手中的异常:TypeError:无法读取null的属性'rating'你能告诉我我犯了什么错误以及如何解决吗?

collections.js

Recipes = new Mongo.Collection('recipes');
Reviews = new Mongo.Collection('reviews');

add_review.js

Template.add_review.events({
    'submit .add-review':function(event){
        var rating = event.target.rating.value;
        var review = event.target.review.value;
            Reviews.insert({
                rating:rating,
                review:review,
                recipeId:Router.current().data()._id
            });
        return false;
})

帮助获得平均评级

Template.reviews.helpers({
    averageRating: function() {
        var reviews = Reviews.find({recipeId: Router.current().data()._id});
        var ratings = _.pluck(reviews, 'rating');
        var sum = ratings.reduce(function(pv, cv){return pv + cv;}, 0);
        var avg = sum / ratings.length;
        return Math.round(avg);
    }
})

find返回一个游标。为了让评论成为一个数组,你需要使用这样的提取:

var reviews = Reviews.find({recipeId: Router.current().data()._id}).fetch();

还要注意,您需要防范评级为空数组的情况。在这种情况下,您的平均值将返回Infinity。也许类似于:

Template.reviews.helpers({
  averageRating: function() {
      var selector = {recipeId: Router.current().data()._id};
      var reviews = Reviews.find(selector).fetch();
      if (reviews.length === 0)
        return 0;
      var ratings = _.pluck(reviews, 'rating');
      var sum = ratings.reduce(function(pv, cv){return pv + cv;}, 0);
      var avg = sum / ratings.length;
      return Math.round(avg);
  }
});

推荐阅读:流星常见错误。