Meteor.js: Как запустить check(), когда аргументы являются объектами Mongodb ObjectId?

В некоторых моих методах 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

любая помощь очень ценится!

Ответ 1

Вместо:

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.

Ответ 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

Ответ 3

Для генерации случайного объектного идентификатора вы должны использовать следующее:

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

Как сказал Куберто, вы можете проверить его на Meteor.Collection.ObjectID:

check(someObjectId, Meteor.Collection.ObjectID)

Ответ 4

Обычно при использовании 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);

подробнее об этом шаблоне

Ответ 5

Полный ответ на исходный вопрос:

Сначала определите совпадение для одного объекта в массиве аргументов:

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

Затем вы можете позвонить:

check(MyArrayOfArguments, [Match._id])