Mongoose:无法在 Mongoose 数组 SchemaType 中添加一项。虽然可以添加不止一个

Posted

技术标签:

【中文标题】Mongoose:无法在 Mongoose 数组 SchemaType 中添加一项。虽然可以添加不止一个【英文标题】:Mongoose: Not able to add one item in Mongoose array SchemaType. Although more than one could be added 【发布时间】:2020-07-18 14:49:04 【问题描述】:

下面是我的架构

var makerSchema = new mongoose.Schema(
    materials:[
        
            type: String,
            required:[true, "Material is a required field"],
            trim:true,
            lowercase:true,
            enum:
                values:['wood','metal','plastic','glass','concrete','other'], 
                message: 'Please choose from the given options only!'
            
        
    ]
,
    timestamps:true
)

var Maker = mongoose.model('Maker', makerSchema);

下面是我的路线

router.post('/maker', async (req, res) => 
    try 
        var maker = new Maker(req.body);
        await maker.save();
        res.status(200).send();
     catch (error) 
        if (error.name === "ValidationError") 
            let errors = ;

            Object.keys(error.errors).forEach((key) => 
              errors[key] = error.errors[key].message;
            );

            return res.status(400).send(errors);
          
          res.status(500).send(error);
    
)

下面是我的表单,我可以通过按住 Ctrl 并单击选项来选择多个项目。

<form action="/maker" method="POST">
    <select multiple class="form-control" id="materials" name="materials">
       <option>Wood</option>
       <option>Metal</option>
       <option>Glass</option>
    </select>
   <input type="submit" value="Submit">
</form>

但如果我选择单个选项,我会收到以下错误,尽管适用于多个选项:

"materials.0":"Please choose from the given options only!"

如何解决此错误并允许用户不仅选择多个选项,还允许选择单个选项?

【问题讨论】:

【参考方案1】:

我的猜测是,当只选择一种材料时,您会得到 maker.materials 的“错误”数据类型,String。 选择多种材料时,您将在路由器中收到Array&lt;String&gt;

所以我会在保存Maker 之前检查路由器中materials 的数据类型。如果还不是,则将其转换为Array

【讨论】:

以上是关于Mongoose:无法在 Mongoose 数组 SchemaType 中添加一项。虽然可以添加不止一个的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性

Mongoose 无法更新数组:未定义的错误

Mongoose 无法对位置数组执行 $near 查询

Node.js 无法使用 Promise、Mongoose 和 GET 请求推送到全局数组

无法使用 Mongoose 删除数组中的对象

无法使用 $pull (Mongoose) 为用户模型删除数组中的对象