Я пытаюсь использовать Express и Mongoose для создания простой формы, которая позволяет пользователю добавлять новые элементы в коллекцию.
Схема мангуста:
var Item = new Schema({
name : {type : String, required : true},
price : {type : Number, required : true},
description : {type: String, required: true},
});
Экспресс маршрут:
var create = function(req, res) {
Item.create(req.body, function(err) {
if (err) return res.render('admin/items/new', {title: "New Item", errors: _.values(err.errors)});
res.redirect('/admin/items/index');
});
};
Пока достаточно просто. Что я хочу сделать, так это добавить соответствующую проверку, чтобы убедиться, что price
, введенное пользователем, является числовым, а если не показать соответствующую ошибку.
С приведенным выше кодом, если пользователь вводит нечисловые символы в текстовое поле цены, я получаю CastError.
Итак, я попытался добавить следующую проверку в свою схему:
Item.path('price').validate(function(v, fn) {
if (typeof v === 'number' || v === undefined) return fn(true);
return fn(false);
}, "must-be-numeric");
Однако кажется, что Mongoose пытается привести значение перед применением этой проверки, поэтому для этого невозможно вернуть соответствующую ошибку проверки, вы все равно просто получите CastError. Кроме того, CastError предотвращает выполнение любых проверок других полей.
Я думаю, что то, что я пытаюсь сделать, довольно распространено (в Rails вы просто добавляете validate :price, :numericality => true
к своей модели, и все).
Есть ли очевидный шаблон, который я упускаю из виду, который облегчает такую проверку типа?
Как это делают все остальные?
Вещи, которые я пробовал/думал:
- Я понимаю, что мог бы использовать дополнительную библиотеку проверки, такую как node-validator, для «предварительной проверки» полей формы перед их передачей в Mongoose. Тем не менее, я действительно не хочу, чтобы дублирование кода или шаблонный беспорядок объединения объектов ошибок из двух валидаторов давали единый набор ошибок, который будет возвращен пользователю.
- В идеале я бы использовал элемент «число» HTML5
input
, чтобы предотвратить ошибочный ввод данных пользователем, но, учитывая, что Firefox и IE не поддерживают его, это еще не начало.