为登录用户创建个人收藏

时间:2016-11-12 15:54:41

标签: mongodb reactjs meteor

import {favRestaurants} from '/lib/collections';
import {Meteor} from 'meteor/meteor';
import {check} from 'meteor/check';

export default function () {
  Meteor.methods({
    'favRestaurants.create' (id, name, rating, priceLevel, type) {
      check(id, String);
      check(name, String);
      check(rating, Number);
      check(priceLevel, Number);
      check(type, String);
      const createdAt = new Date();
      const restaurant = {id, name, rating, priceLevel, type, createdAt};
      if(check(Meteor.user()) == null){
        console.log('onlye logged in users can data');
      }else{
        FavRestaurants.insert(restaurant);
      }
    }
  });
}

这是我将数据添加到餐馆馆藏的插入方法。当我控制台登录时,检查(Meteor.user())'在控制台中我得到null作为输出。按照这种逻辑,你不应该能够将数据添加到集合中,尽管这仍然是可能的。

我还希望为每位用户提供个性化的FavResaurants系列。我试图检查是否有用户,然后在客户端的main.js文件中添加一个集合。

Meteor.loggingIn(() => {
  console.log('check for user method');
  var restId = 0;
  if(Meteor.user() != null){
    console.log('created new collection for the user');
    const FavRestaurants = new Mongo.Collection('favRestaurants' + restId);
  }
  restId++;
});

我没有使用此方法获得任何输出到控制台,我在流星docs中找到了该方法。代码是在错误的地方吗?任何帮助都很受欢迎。

根据docs,Accounts.ui.config是我应该使用的方法。但我不确定在代码中我应该说出来。到目前为止,此方法的放置导致我的应用程序崩溃。

2 个答案:

答案 0 :(得分:1)

回答您的第一个问题,只允许登录的客户端访问某个方法,您应该使用以下内容:

if (!Meteor.userId()) {
   throw new Meteor.Error('403', 'Forbidden');
}

现在,我看到你想要一个集合来为客户端的每个用户存储最喜欢的餐馆。但是在我看来,每个客户端只有一个登录用户,所以你不需要为每个用户单独收集(因为集合在每个客户端),你可以引用用户使用它的ID,然后通过以下查询获取用户最喜欢的餐馆:

FavRestaurants.find({user: Meteor.userId()});

此外,正如docs建议的那样,Meteor.loggingIn是一种方法,可以告诉您某些用户是否正在登录。您正在做的是覆盖它,而不是&#39有意义。

您应该执行以下操作:

if (Meteor.loggingIn()) {
  // Do your stuff
}

希望它能让你更清晰。

答案 1 :(得分:0)

为每个用户创建一个集合是一种糟糕的方法。 定义您的favRestaurants集合一次,并在插入之前在餐厅文档中添加所有者字段。 创建一个发布方法,仅向客户端发布userid favrestaurant。

还有一件事,首先在Meteor方法中检查你的用户ID,这样可以避免不必要的处理。

REGS