首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >userId未被保存

userId未被保存
EN

Stack Overflow用户
提问于 2014-12-01 16:52:07
回答 2查看 100关注 0票数 1

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

代码语言:javascript
复制
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来查看它们的值:

代码语言:javascript
复制
console.log(visit);
console.log(visit.userId);
var visitId = Visits.insert(visit);

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

更新2:

visits.js中增加了allow回调

代码语言:javascript
复制
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方法中添加的元素。

EN

回答 2

Stack Overflow用户

发布于 2014-12-09 18:55:45

就像基思·尼古拉斯说的,使用:

代码语言:javascript
复制
var properties = { 
   userId: Meteor.userId()
}

你的allow函数看起来很奇怪。我会这样设置:

代码语言:javascript
复制
// 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(){}),你应该不需要定义任何允许。此外,如果您正在进行调用,您应该将Meteor.userId()作为参数传递给您的方法,因为Meteor.userId()并不存在于服务器端。

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

更好的做法是:创建一个想要插入的对象“and”,然后进行调用:

客户端:

代码语言:javascript
复制
var visit = {
  visit_date: getYourDate,
  name: getYourName,
  userId: Meteor.userId()
}

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

服务器端:

代码语言:javascript
复制
Meteor.methods({
  visitInsert: function(visit) {
    check(visit.userId, String);
    check(visit, {
      visit_date: String,
      name: String
    });

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

干杯,

票数 0
EN

Stack Overflow用户

发布于 2014-12-01 17:47:40

尝试使用

代码语言:javascript
复制
var properties = { 
   userId: Meteor.userId()
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27224678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档