一尘不染

我应该如何用猫鼬存储价格?

node.js

我正在将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。


阅读 262

收藏
2020-07-07

共1个答案

一尘不染

提示:
此处描述的方法基本上只是chovy的answer的另一种实现。

猫鼬3和4的解决方法:

如果您在直接在模式中定义getter和setter时遇到麻烦,也可以使用该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;
});
2020-07-07