【问题标题】:omit empty strings fields mongoose省略空字符串字段猫鼬
【发布时间】:2023-01-19 15:36:07
【问题描述】:

我有以下架构:

const mySchema = new mongoose.Schema({
   x: String,
   y: String
})

当来自前端的用户在他的身体中请求时:

req.body = {
   'x' : '',
   'y': ''
}

这会导致在 MongoDB 中创建一个字段,但带有一个空字符串。 我需要一种通过某种方式将空字符串设置为未定义来防止这种行为的方法。

猫鼬有这样的选择吗?还是我必须为此预测我自己的中间件?

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    您不需要猫鼬或中间件来处理这个问题。您可以快速编写几行代码来检查空值并将它们从 MongoDB 写入操作中排除。

    前任:

    const newEntry = Object.entries(req.body).reduce((obj, [key, value]) => {
      if (value) obj[key] = value
      return obj
    }, {})
    

    在此示例中,我使用 Object.entriesreq.body 转换为数组,并使用 Array.reduce 方法对其进行迭代,其中如果有要添加的值,我将键:值对添加到新对象。由于空字符串值是错误的,我可以对值进行简单的if检查。然后我将 reduce 方法的返回分配给变量newEntry。然后我将获取新条目并使用它创建 MongoDB 文档。

    这可以提取到辅助方法中,并在需要检查从对象中删除空值的任何路由中重复使用。

    Array.reduce 上的文档

    Object.entries 上的文档

    【讨论】:

    • 是的,想象一下如果我有嵌套字段会怎样? (或对象数组中的嵌套字段)
    • 有趣的。这大大增加了问题的范围。许多关于 JS 中堆栈溢出的递归 nil-check 算法的解决方案可供探索。但是您可能知道请求正文的结构,是吗?您只需要对请求正文中的每个对象实例执行此操作,因此无论您到达那里,这都可以用作解决方案。
    • @Ps,当然,这就是我实际要做的,并且在 mongoose github 页面上创建了一个新问题
    【解决方案2】:

    您可以对 Mongoose 模式使用 set 方法:

    const mySchema = new mongoose.Schema(
      {
        myAttribute: {
          type: String,
          set: (attribute: string) => attribute === '' ? undefined : attribute,
        },
      },
      { strict: 'throw' },
    );
    

    如果字符串等于'',这将取消设置该字段。

    使用它来修剪字符串: set: (a: string) => a?.trim() === '' ? undefined : a

    【讨论】:

      猜你喜欢
      • 2019-10-07
      • 2019-12-12
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2018-06-15
      相关资源
      最近更新 更多