我正在将node.js的猫鼬模式与express-validator(具有node-validator santiziations和Validator)一起使用。
存储商品价格的好方法是什么?
我目前有
var ItemSchema = new Schema({ name : { type: String, required: true, trim: true } , price : Number });
价格是可选的,所以我有:
if ( req.body.price ) { req.sanitize('price').toFloat(); req.assert('price', 'Enter a price (number only)').isFloat(); }
express-validator给了我isNumeric(允许0填充),isDecimal和isInt …我宁愿只是将其转换为十进制并去除所有字符,所以我总是将42.00插入db中。
我要允许他们输入$ 42.00,$ 42、42、42.00和仅存储42.00。我该怎么做?并仍然验证我看到的是类似数字的内容,例如,如果他们输入“ abc”,我想使用req.assert将错误返回到表单。
另外,我认为货币最终将成为一个问题。
更新,我发现这篇文章说以美分存储价格为整数,所以4200 https://dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what- data-type-to-use
当我调用item.price时,我只需要一种将4200转换为$ 42.00的方法,还需要清理并将输入转换为4200。
提示: 此处描述的方法基本上只是chovy的answer的另一种实现。
如果您在直接在模式中定义getter和setter时遇到麻烦,也可以使用该schema.path()函数来完成此工作:
schema.path()
var ItemSchema = new Schema({ name: String, price: Number }); // Getter ItemSchema.path('price').get(function(num) { return (num / 100).toFixed(2); }); // Setter ItemSchema.path('price').set(function(num) { return num * 100; });