_.extend 忽略 MEAN Stack 中的一个属性

Posted

技术标签:

【中文标题】_.extend 忽略 MEAN Stack 中的一个属性【英文标题】:_.extend ignores a property in MEAN Stack 【发布时间】:2017-03-03 14:34:05 【问题描述】:

我正在尝试覆盖 MongoDB 中的现有对象。它工作了一个月。现在我的 _.extend() 忽略了一个属性。文档的架构是:

var KlausurSchema = new Schema(
    
        name: String,
        pruefer: 
            eins: String,
            zwei: String
        ,
        datum: 
            start: Date,
            dauer: Number
        ,
        notenspiegel: 
            von: [Number],
            bis: [Number]
        ,
        aufgaben: [
            name: String,
            punkte: Number
        ],
        studenten: [
            matrnr: Number,
            status: String,             //Krank/Abgemdelet/Verfügbar
            vorname: String,
            nachname: String,
            bewertung: Number,
            pversuch: Number,
            pvermerk: String,
            freiverm: String,
            labnr: Number,
            porgnr: Number,
            aenddat: String,
            punkte: [],
            gesamtPunkte: Number,
            stapel: Number,
            studiengang: String,
            importID: String,           //um einzelne Importe zu löschen
            korrekturAnzahl: Number     //um Nachkorrigierte zu exportieren
        ],
        imports: [
            id: String,
            datum: Date,
            studiengang: String,
            anzahl: Number
        ],
        hoersaele: [Object],
        aenderdat: Date

    
    )
    ;

我执行以下操作。使用 PUT 方法我加载了这个函数:

    exports.put = function (req, res)
    Klausur.load(req.params.klausurId, function (err, klausur) 

        console.log(req.body);
        console.log("________________________________________");
        klausur = _.extend(klausur, req.body);
        console.log(klausur);



        klausur.save(function (err) 
            res.jsonp(klausur);
        );

        emitChange();
    );

就像我说的,它运行良好。但是如果我输入这个(req.body 的输出):

 _id: '5809da4c3a81b8341abf8f51',           
  name: 'Analysis',                          
  aenderdat: '2016-10-21T09:05:16.350Z',     
  __v: 4,                                    
  hoersaele:                                 
   [  _id: '58074b1f495b58d018116983',      
       name: 'Aula2',                        
       kapazitaet: 10,                       
       puffer: 2,                            
       adresse: 'isauhsda',                  
       hausmeister: 'sydkl',                 
       telefon: '203',                       
       aenderdat: '2016-10-21T08:03:44.660Z',
       __v: 0,                               
       belegung: [Object]  ],               
  imports:                                   
   [  id: 'i1e6rdi0lq',                     
       datum: '2016-10-21T09:05:39.886Z',    
       studiengang: 'Maschi',                
       anzahl: 3,                            
       _id: '5809da633a81b8341abf8f63' ,    
      id: 'gjd84dtgho',                     
       datum: '2016-10-21T09:16:34.429Z',    
       studiengang: 'WirtIng',               
       anzahl: 6,                            
       _id: '5809dcf23a81b8341abf8f67'  ],  
  studenten: ...

它的出口向我展示了这一点(在 _.extend() 之后来自 klausur 的输出):

 imports:                                                                                      
  [  _id: 5809da633a81b8341abf8f63,                                                           
      anzahl: 3,                                                                               
      studiengang: 'Maschi',                                                                   
      datum: Fri Oct 21 2016 11:05:39 GMT+0200 (Mitteleuropäische Sommerzeit),                 
      id: 'i1e6rdi0lq' ,                                                                      
     _id: 5809dcf23a81b8341abf8f67,                                                           
      anzahl: 6,                                                                               
      studiengang: 'WirtIng',                                                                  
      datum: Fri Oct 21 2016 11:16:34 GMT+0200 (Mitteleuropäische Sommerzeit),                 
      id: 'gjd84dtgho'  ],                                                                    
 hoersaele: [],                                                                                
 __v: 4,                                                                                       
 aenderdat: Fri Oct 21 2016 11:05:16 GMT+0200 (Mitteleuropäische Sommerzeit),                  
 name: 'Analysis',                                                                             
 _id: 5809da4c3a81b8341abf8f51  

我留下了不重要的属性。我只是想向您展示“Hoersaele”属性不会转移到上传到数据库的新对象。

MongoDB 给了我这个错误信息:

 [ValidationError: Klausur validation failed]
  message: 'Klausur validation failed',
  name: 'ValidationError',
  errors:
    hoersaele:
       [CastError: Cast to Array failed for value "[object Object]" at path "hoersaele"]
        message: 'Cast to Array failed for value "[object Object]" at path "hoersaele"',
        name: 'CastError',
        kind: 'Array',
        value: [Object],
        path: 'hoersaele',
        reason: undefined   

有什么建议吗?谢谢!

【问题讨论】:

【参考方案1】:

我看到不止一种可能的解释或错误:

1。在您的架构中,您定义了 hoersaele: [Object],但 Mongoose 没有定义 Object 类型:SchemaTypes。

如果没有验证,您应该使用:hoersaele: [Schema.Types.Mixed]

或者可以为此定义另一个架构并在内部使用它:hoersaele: [HoersaeleSchema]

或者,也可以将它们存储在另一个集合中,然后引用它们并在您想要检索完整模型时使用 Mongoose 的 populate 功能:hoersaele: [Schema.Types.ObjectId]

2。看来您尝试使用req.body 扩展原生对象Document,这是一个普通的javascript对象。

如果要将它们合并到一个普通的 javascript 对象中,您应该使用Document#toObject([options]) 来检索普通的 javascript 对象。

这段代码应该可以工作:

let mergedKlausur = _.extend(klausur.toObject(), req.body);

3。如果您想使用req.body 更新现有模型,我认为您应该使用:

klausur.update($set: req.body);

【讨论】:

以上是关于_.extend 忽略 MEAN Stack 中的一个属性的主要内容,如果未能解决你的问题,请参考以下文章

在 MEAN Stack 应用程序中从 mongo db 检索数据

MEAN STACK angular 2:从打字稿中的多个api获取数据

启动节点应用程序时出错 - MEAN Stack

MEAN Stack:Cast to ObjectId 值“:id”失败

如果我使用 % extends %,Django 会忽略子模板中的内容

如何将 MEAN Stack 部署到网络主机