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])