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
但是我认为这不是一个好主意,因为鉴别符似乎在请求的生存期之后仍然存在,那么我是否为内存泄漏奠定了基础?
我可以看到两种前进的方式:
return Record.discriminator(uuidv4(), new mongoose.Schema(schema), grid._id)
集合。有什么想法吗?