2014-08-27 8 views
5

Nello schema utente sottostante c'è un campo foobar.events, che sto provando a inserire nuovi hash (che vengono ricevuti da una richiesta POST API) a.Node e Mangusta - Errore durante il salvataggio: TypeError: Object.keys chiamato non-object

var userSchema = mongoose.Schema({ 

    foobar: { 
     id   : String, 
     token  : String, 
     email  : String, 
     name   : String, 
     events  : [{ 
      action   : String, 
      timestamp  : Date, 
      user_xid  : String, 
      type   : {type: String}, 
      event_xid  : String  
     }] 
    } 

}); 

E qui è la logica per quella rotta espresso:

app.post('/foobar/post', function(req, res) { 
    var jb_user_xid = req.body['events'][0]['user_xid']; 
    var jb_timestamp = req.body['events'][0]['timestamp']; 
    var jb_action = req.body['events'][0]['action']; 
    var jb_type  = req.body['events'][0]['type']; 
    var jb_event_xid = req.body['events'][0]['event_xid']; 

    User.findOne({'foobar.id':jb_user_xid}, function(err, user) { 
     console.log(user); 
     user.foobar.events.push({ 
      user_xid: jb_user_xid, 
      timestamp: jb_timestamp, 
      action: jb_action, 
      type: jb_type, 
      event_xid: jb_event_xid 
     }); 
     user.save(function(err) { 
      if (err){ 
       console.log("Error on save: " + err); 
      } 
      else { 
       console.log("Save successful"); 
      } 
     }); 
    }); 

    res.writeHead(200); 
    res.end(); 
    return; 
}); 

Il metodo find viene eseguito con successo, ma il seguente errore viene generato quando si tenta di salvare nel database: Error on save: TypeError: Object.keys called on non-object - qualche idea del perché questo errore viene generato?

This thread had a similar problem, ma la modifica di findOne a findById ha interrotto la query dell'utente.

Come nota a margine, questo è ciò che viene restituito nella req.body dal API:

{ events: 
    [ { action: 'updation', 
     timestamp: 1408846680, 
     user_xid: 'aguxwNqb_Xg87buMyP6Wiw', 
     type: 'move', 
     event_xid: 'vhAkgg1XwQvLynAkkCc8Iw' } ], 
    notification_timestamp: 1408846680 } 

Ed ecco ciò che è restituito dal metodo User.findOne

{ __v: 17, 
    _id: 53f7d23e432de20200970c10, 
    foobar: 
    { id: 'aguxwNqb_Xg87buMyP6Wiw', 
     name: 'Test User', 
     token: 'W3AjaI7_iOWilcKRpmxenQWi', 
     events: [] } 
} 
+0

In che modo 'findById' ha interrotto la query dell'utente? L'errore sembra che il valore della variabile 'utente' non abbia il tipo corretto. Che aspetto ha l'utente quando viene registrato? – wdberkeley

+0

Il campo 'user_xid' si collega a un utente specifico, ecco perché viene utilizzato il metodo' findOne'. Ho aggiornato la domanda per includere il registro 'user' – Anconia

+0

Potrebbe essere un problema con il tuo schema. La riga che dice 'type: {type: String}' dovrebbe probabilmente essere qualcosa come 'event_type: String'. Non sono sicuro che ciò abbia a che fare con il problema, mi sembra strano. – ctlacko

risposta

5

Questo errore era in realtà a causa di vecchi dati all'interno mio database Mongo. Il campo events era pieno di stringhe aggiuntive. Ho eliminato questi e il mio codice originale ha iniziato a funzionare correttamente. Non sono state necessarie modifiche al codice precedente.

+0

Ho avuto lo stesso errore ed è stato perché avevo un campo definito come un sottoschema personalizzato di ID oggetto, ma i dati in questo campo contenevano già array di stringhe (che sembrava come ID oggetto). Le query sono state scritte per cercare stringhe in modo che continuassero a funzionare. Gli aggiornamenti non lo farebbero perché Mongo non poteva eseguire Object.keys() su questo sottoschema che era in effetti una serie di stringhe. Lezione: assicurati che lo schema corrisponda ai dati esistenti! – micah94

1

ho provato il codice e funziona perfettamente .. per me .. prova a controllare la versione del modulo mangusta o qualcosa del genere. Se hai ancora problemi, ti preghiamo di farlo usando la funzione di aggiornamento invece di salvare ... Sarebbe più orientato alle prestazioni.

questa è la seguente ho usato

var mongoose = require('mongoose'); 
    mongoose.connect('mongodb://localhost/test'); 
    var db = mongoose.connection; 
    db.on('error', console.error.bind(console, 'connection error:')); 
    db.once('open', function callback() { 
     // yay! 
    }); 
    var userSchema = mongoose.Schema({ 

     foobar: { 
      id   : String, 
      name   : String, 
      events  : [{ 
       action   : String, 
       timestamp  : Date, 
       user_xid  : String, 
       type   : {type: String}, 
       event_xid  : String  
      }] 
     } 

    }); 







    var User = mongoose.model('user', userSchema); 

    /* 
    //used for saving. 
    var person = new User({ foobar: 
     { id: 'aguxwNqb_Xg87buMyP6Wiw', 
      name: 'Test User', 
      token: 'W3AjaI7_iOWilcKRpmxenQWi', 
      events: [] } 
    }); 
    person.save(function(err,data){ 
    console.log(err); 
    console.log(data); 
    }) 

    */ 


    User.findOne({'foobar.id':'aguxwNqb_Xg87buMyP6Wiw'}, function(err, user) { 
      console.log(user); 
      user.foobar.events.push({ action: 'updation', 
      timestamp : 1408846680, 
      user_xid: 'aguxwNqb_Xg87buMyP6Wiw', 
      type: 'move', 
      event_xid: 'vhAkgg1XwQvLynAkkCc8Iw' }); 
      user.save(function(err) { 
       if (err){ 
        console.log("Error on save: " + err); 
       } 
       else { 
        console.log("Save successful"); 
       } 
      }); 
     }); 
+0

Grazie per aver esaminato questo! Ascolterò il tuo avvertimento per l'uso di 'update' piuttosto che' save' – Anconia

Problemi correlati