Meteor.js:当参数是Mongodb ObjectId时如何运行check()?

时间:2013-12-31 01:16:43

标签: mongodb meteor

在我的一些Meteor方法中,我从客户端发送Mongodb ObjectId作为参数。我想通过Meteor的check()系统来运行它们,但我似乎找不到任何与它们成功匹配的东西。

我试过

var someObjectId = Meteor.Collection.ObjectId();

check(someObjectId, Meteor.Collection.ObjectId()) // fails
check(someObjectId, { _str : String }) //fails
check(someObjectId, String) //fails

任何帮助非常感谢!

5 个答案:

答案 0 :(得分:10)

而不是:

check(someObjectId, Meteor.Collection.ObjectID());

请不要使用括号:

check(someObjectId, Meteor.Collection.ObjectID);

编辑 -

请注意,此检查的错误消息并不理想。

check({}, Meteor.Collection.ObjectID);
// Error: Match error: Expected

可以假设消息应该是

// Error: Match error: Expected ObjectId, got object

您可以在检查包的此代码段中看到这种情况发生的原因。

https://github.com/meteor/meteor/blob/devel/packages/check/match.js

if (pattern instanceof Function) {
    if (value instanceof pattern)
        return;
    // XXX what if .name isn't defined
    throw new Match.Error("Expected " + pattern.name);
}

Meteor.Collection.ObjectID没有name属性。

答案 1 :(得分:2)

作为替代解决方案,您可以简单地将十六进制字符串作为参数而不是ObjectID传递。

var idValidator = Match.Where(function (id) {
    check(id, String);
    return /[0-9a-fA-F]{24}/.test(id);
});

check(new Meteor.Collection.ObjectID()._str, idValidator);
// success

check('', idValidator);
// Error: Match error: Failed Match.Where validation

check({}, idValidator);
// Error: Match error: Expected string, got object

check([], idValidator);
// Error: Match error: Expected string, got object <--- bug? I expect array

注意,这个正则表达式是从这里开始的。

https://github.com/mongodb/js-bson/blob/master/lib/bson/objectid.js

答案 2 :(得分:1)

您应该使用以下来生成随机ObjectID:

var someObjectId = new Meteor.Collection.ObjectID();

正如Cuberto所说,你可以通过Meteor.Collection.ObjectID检查它:

check(someObjectId, Meteor.Collection.ObjectID)

答案 3 :(得分:1)

通常在使用check()时,您无法生成新的Meteor _id。这是使用Match.check()

的替代方法

首先使用:

扩展Match对象
Match._id = Match.Where(function (id) {
  check(id, String);
  return /[a-zA-Z0-9]{17,17}/.test(id);
});

这很有用,因为您可能会在许多方法中检查_id

现在简单地说:

check(_id,Match._id);

more on this pattern

答案 4 :(得分:0)

完整回答原始问题:

首先,为参数数组中的单个对象定义匹配器:

Match._id = Match.Where(function (id) {
  check(id, String);
  return /[a-zA-Z0-9]{17,17}/.test(id);
});

然后你可以打电话:

check(MyArrayOfArguments, [Match._id])