userId未保存

时间:2014-12-01 08:52:07

标签: meteor

我在visitInsert中有lib/collections/visits.js个功能来保存访问权限。 它还添加了登录用户的userId,但是当前访问保存得很好,但是当我查看mongo数据库时,它还没有保存userId。这是visitInsert函数:

Meteor.methods({
  visitInsert: function(visitAttributes) {
    check(Meteor.userId(), String);
    check(visitAttributes, {
      visit_date: String,
      name: String
    });

    var properties = {
      userId: this.userId
    };

    var visit = _.extend(visitAttributes, properties);
    var visitId = Visits.insert(visit);
    return {
      _id: visitId
    };
  }
});

那么这里有什么问题?

更新:

lib/collections/visits.js中,我添加了一些console.log来查看值是什么:

console.log(visit);
console.log(visit.userId);
var visitId = Visits.insert(visit);

visitvisit.userId都填充了正确的值,因此使用当前登录用户的ID。但是当使用Visits.insert保存到数据库时,访问会被保存,但没有userId ???

更新2:

allow中添加了visits.js回调:

Visits.allow({
  insert: function (userId, visit) { return !! userId; },
  update: function(userId, visit) { return ownsDocument(userId, visit); },
  remove: function(userId, visit) { return ownsDocument(userId, visit); }
});

解决方案:该问题与allow回调无关,因为它是从方法调用的。我发现因为我使用aldeed:collection2包,我需要明确检查所有属性。不仅是来自表单的那些,还有我在insert方法中添加的那些。

2 个答案:

答案 0 :(得分:0)

像凯斯尼古拉斯说的那样使用:

var properties = { 
   userId: Meteor.userId()
}

你的允许功能似乎很奇怪。我会设置这样的东西:

// check if user is owner of object
ownsObject = function (userId, obj) {
    return obj && obj.userId === userId;
};

Visits.allow({
  insert: ownsObject,
  update: ownsObject,
  remove: ownsObject
});

此外,目前还不清楚你在使用什么。您使用的是您定义的方法“visitInsert”吗?如果是这样,如果您在客户端上调用Meteor.call('visitInsert',function(){}),则不需要定义任何allow。此外,如果您正在进行呼叫,则应将Meteor.userId()作为参数传递给您的方法,因为Meteor.userId()不存在于服务器端。

总而言之,我建议您使用Meteor.userId()构建“visitAttributes”客户端。只需调用服务器端方法,只检查属性和Visits.insert(visitAttributes)。

更好:创建一个要插入的对象“访问”并拨打电话:

客户方:

var visit = {
  visit_date: getYourDate,
  name: getYourName,
  userId: Meteor.userId()
}

Meteor.call("visitInsert", visit, function(err, res){
  if(!err){
    Console.log("Visit inserted!");
  }
});

服务器端:

Meteor.methods({
  visitInsert: function(visit) {
    check(visit.userId, String);
    check(visit, {
      visit_date: String,
      name: String
    });

    return Visits.insert(visit);
  }
});

干杯,

答案 1 :(得分:-1)

尝试使用

var properties = { 
   userId: Meteor.userId()
}