如何从 html 表单发送数组对象以遵循 mongoose 模式

问题描述 投票:0回答:1

所以我有了这个 HTML 表单,我的想法是在我的 mongo 数据库上创建一个新文档,它代表基于几个标准给老师的笔记,我在 note 属性中使用一个数组,其中包含以下对象例如,包含注释的作者。

(在浏览器中,我以以下形式输入了这些内容: 姓名 : 马西斯 || 姓氏 : de sousa || 作者:马蒂斯·德索萨)

我尝试过使用

notes[0].author
notes[0][author] without success

    <form action="/teachers" method="post">
        <input type="text" placeholder="name" name="name" required>
        <input type="text" placeholder="familyName" name="familyName" required>
        <input type="text" name="notes[0].author">
        <input type="number" name="notes[0].knowledge">
        <input type="number" name="notes[0].helpfulness">
        <input type="number" name="notes[0].attitude">
        <input type="number" name="notes[0].overallRating">
        <input type="text" name="notes[0].comment">
        <button>Submit</button>
    </form>

表单必须遵循猫鼬模式:

const teacherSchema = new mongoose.Schema({

    name: {
        type: String,
        required: true
    },
    familyName: {
        type: String,
        required: true
    },
    notes: [
    {   
        author: {
            type: String,
            required: true
        },
        knowledge: {
            type: Number,
            required: true,
            min:0,
            max:10
        },
        helpfulness: {
            type: Number,
            required: true,
            min:0,
            max:10
        },
        attitude: {
            type: Number,
            required: true,
            min:0,
            max:10
        },
        overallRating: {
            type: Number,
            required: true,
            min:0,
            max:10
        },
        comment: {
            type: String,
            required: false
        }
    }]
});

但是,要么在注释中输出空数组,要么输出这个问题

C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:3197
    this.$__.validationError = new ValidationError(this);
                               ^

ValidationError: Teachers validation failed: notes: Cast to embedded failed for value "Mathis DE SOUSA" (type string) at path "notes" because of "ObjectParameterError"
    at Document.invalidate (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:3197:32)
    at model.$set (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:1456:12)
    at model.$set (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:1111:16)
    at model.Document (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:166:12)
    at model.Model (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\model.js:130:12)
    at new model (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\model.js:4770:15)
    at C:\Users\hddes\Desktop\js-udemy\ESUPcamp\index.js:55:24
    at Layer.handle [as handle_request] (C:\Users\hddes\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\hddes\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\hddes\node_modules\express\lib\router\route.js:114:3) {
  errors: {
    notes: CastError: Cast to embedded failed for value "Mathis DE SOUSA" (type string) at path "notes" because of "ObjectParameterError"
        at SchemaDocumentArray.cast (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\schema\documentArray.js:508:19)
        at SchemaType.applySetters (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\schemaType.js:1221:12)
        at model.$set (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:1414:22)
        at model.$set (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:1111:16)
        at model.Document (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:166:12)
        at model.Model (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\model.js:130:12)
        at new model (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\model.js:4770:15)
        at C:\Users\hddes\Desktop\js-udemy\ESUPcamp\index.js:55:24
        at Layer.handle [as handle_request] (C:\Users\hddes\node_modules\express\lib\router\layer.js:95:5)
        at next (C:\Users\hddes\node_modules\express\lib\router\route.js:144:13) {
      stringValue: '"Mathis DE SOUSA"',
      messageFormat: undefined,
      kind: 'embedded',
      value: 'Mathis DE SOUSA',
      path: 'notes',
      reason: ObjectParameterError: Parameter "obj" to Document() must be an object, got "Mathis DE SOUSA" (type string)
          at EmbeddedDocument.Document (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:113:11)
          at EmbeddedDocument.Subdocument (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\types\subdocument.js:34:12)
          at EmbeddedDocument.ArraySubdocument [as constructor] (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\types\arraySubdocument.js:44:15)
          at new EmbeddedDocument (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\schema\documentArray.js:127:17)
          at SchemaDocumentArray.cast (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\schema\documentArray.js:502:22)
          at SchemaType.applySetters (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\schemaType.js:1221:12)
          at model.$set (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:1414:22)
          at model.$set (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:1111:16)
          at model.Document (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\document.js:166:12)
          at model.Model (C:\Users\hddes\Desktop\js-udemy\ESUPcamp\node_modules\mongoose\lib\model.js:130:12),
      valueType: 'string'
    }
  },
  _message: 'Teachers validation failed'
}

抱歉,如果这是一个愚蠢的问题或错误的表述,我是初学者

谢谢您的帮助:)

javascript html node.js express mongoose
1个回答
0
投票

基于以下表格:

<input type="text" placeholder="name" name="name" required>
        <input type="text" placeholder="familyName" name="familyName" required>
        <input type="text" name="notes[0].author">
        <input type="number" name="notes[0].knowledge">
        <input type="number" name="notes[0].helpfulness">
        <input type="number" name="notes[0].attitude">
        <input type="number" name="notes[0].overallRating">
        <input type="text" name="notes[0].comment">

req.body.data = {
name:"Mathis",
familyName:"de sousa"
notes:[
  {
    author:"authorName",
    knowledge:"biology",
    helpfullness:5,
    attitude:5
    overallRating:4.5
    comment:"keep it up"
    
  }
]
}
let request = req.body.data
let teacherSchema = new MODELS.teacherSchema()
teacherSchema.name = req.body.data.name
teacherSchema.familyName = req.body.data.familyName
teacherSchema.notes.push(req.body.data.notes)
await teacherSchema.save()

© www.soinside.com 2019 - 2024. All rights reserved.