如何动态生成猫鼬鉴别符(在运行时?)

时间:2020-07-18 17:18:25

标签: node.js mongodb mongoose

TL; DR:有一种安全的方法可以在运行时动态定义猫鼬鉴别符吗?

我有一个带有MongoDB集合的应用程序,用户可以在其中控制基础架构。

我可以添加一个或两个固定的必填字段,对于用户可以更改的其余部分,只需使用mongoose.Mixed,但我想使用Mongoose的验证和区分符。

因此,我得到的是第二个集合Grid,用户可以在其中定义他们希望数据采用的形状,并在我的 main 模型{{1 }},我添加了一个功能,可以根据第二个集合中的定义动态生成一个鉴别符。

我的Record模型的代码如下:

Record

这是在Express应用程序内部,我在中间件处理程序中使用该模型,如下所示:


const mongoose = require("mongoose")

const recordSchema = new mongoose.Schema({
    fields: {
        type: Array,
        required: true
    }
}, {
    discriminatorKey: "grid"
})

const Record = mongoose.model("Record", recordSchema)

module.exports = grid => {

    // Generate a mongoose-compatible schema from the grid's field definitions
    const schema = grid.fields.map(field => {
        if(field.type === "string") return { [field.name]: String }
        if(field.type === "number") return { [field.name]: Number }
        if(field.type === "checkbox") return { [field.name]: Boolean }
        return { [field.name]: mongoose.Mixed }
    })

    return Record.discriminator(grid._id, new mongoose.Schema(schema))
}

这在第一个请求上很好有效,但此后出现错误async (req, res) => { const grid = await Grid.findById(req.params.id) const Record = await GenerateRecordModel(grid) const records = await Record.find({}) res.json({ ...grid, records }) }

我猜这是因为每个模型只能有一个名字相同的鉴别器。

每当调用函数时,我都可以给每个鉴别符一个唯一的名称:

Discriminator with name “ ” already exists

但是我认为这不是一个好主意,因为鉴别符似乎在请求的生存期之后仍然存在,那么我是否为内存泄漏奠定了基础?

我可以看到两种前进的方式:

  1. 已完成?在应用启动时(而不是仅在HTTP请求进入时)定义所有标识符,并编写大量额外的逻辑来处理用户在上创建,更新或删除定义 return Record.discriminator(uuidv4(), new mongoose.Schema(schema), grid._id) 集合。
  2. SIMPLER?放弃使用区分符,只使用猫鼬。混合后,就猫鼬而言,任何事情都可以解决,自己编写验证。

有什么想法吗?

0 个答案:

没有答案