2015-11-26 3 views
8

Sto compilando il mio DB con alcuni dati fittizi in cui sto cercando di aggiungere un utente. Viene creato un oggetto utente ma nessuna delle proprietà è salvata ... come va?Perché MongoDB non salva le mie proprietà

app.get('/setup', function (req, res) { 

    User.findOne({ name: "Nick" }, function (err, user) { 

     if (user == undefined) { 

      var nick = new User({ 
       name: "Nick", 
      }).save(); 

      res.json({ "success": true, "msg": "user created" }); 
     } else { 
      res.json({ "success": true, "msg": "user existed" }); 
     } 
    }); 
}); 

chiamando questo restituisce "utente creato". Ecco il mio metodo per produrre tutti gli utenti:

app.get('/users', function(req, res) { 

    User.find({}, function(err, user) { 
     res.json(user); 
    }); 
}); 

L'output qui è

[ 
    { 
    "_id": "565772db5f6f2d1c25e999be", 
    "__v": 0 
    }, 
    { 
    "_id": "5657734ba859fefc1dca77db", 
    "__v": 0 
    }, 
    { 
    "_id": "5657738ba859fefc1dca77dc", 
    "__v": 0 
    }, 
    { 
    "_id": "565774f1cf99a2b81fca1e7f", 
    "__v": 0 
    }, 
    { 
    "_id": "565775f0cf99a2b81fca1e80", 
    "__v": 0 
    } 
] 

Dove ho cercato di aggiungere "Nick" un paio di volte ... noe alcun input? : D

Il mio modello Mongoose, situato in un proprio file Model.js con altri modelli:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

// set up a mongoose model and pass it using module.exports 
module.exports = mongoose.model('User', new Schema({ 
    name: String, 
    password: String, 
})); 
+1

Cambia salvataggio in '.save (funzione (err, utente) {console.log (err)})' per vedere se c'era qualche errore – Molda

+0

Da dove viene l'oggetto Utente? Stai usando mangusta? – tmuecksch

+0

Nessun errore e sto usando mangusta sì – Jason94

risposta

2

È necessario definire nome chiave nella vostra utente schema per esso essere salvato.

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var userSchema = new Schema({ 
    name: String 
}); 

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

Sì, ho dimenticato di aggiungerlo, ma ho aggiunto la chiave del nome allo schema. Posso avere più scema nello stesso file? Cuz in questo momento ho tutti i miei "modelli" in un file Models.js. Questo include l'Utente per uno, e anche altri. – Jason94

+0

Sì, puoi avere tutti i tuoi 'modelli' nello stesso file ma non è raccomandato. Contrassegna anche la risposta come accettata se ti ha aiutato a risolvere il problema. –

+0

Non ha risolto il mio problema, quello che ho detto è che ho dimenticato di aggiungere il codice. Altrimenti "Utente" non avrebbe funzionato affatto. – Jason94

5

Dato hai un nome in voi utente schema, è anche bisogno di aspettare fino a quando il save() query è finito e quindi inviare una risposta:

app.get('/setup', function (req, res) { 
    User.findOne({ name: "Nick" }, function (err, user) { 
     if (err) { 
      return res.json({ "success": false, "error": err }); 
     } 

     if (user) { 
      return res.json({ "success": true, "msg": "user existed" }); 
     } 

     var nick = new User({ name: "Nick" }); 
     nick.save(function(err, userObj) { 
      if (err) { 
      return res.json({ "success": false, "error": err }); 
      } 

      res.json({ "success": true, "msg": "user created" }); 
     }); 
    }); 
}); 
+0

Perché devo aspettare? Passano diversi secondi tra I'm sending/setup e/users – Jason94

+2

Poiché il metodo save() è asincrono e prima di inviare una risposta positiva è necessario assicurarsi che non ci siano errori e che il documento sia stato inserito correttamente. –

4

riprova con questo codice:

app.get('/setup', function (req, res) { 

    User.findOne({ name: "Nick" }, function (err, user) { 

     if (!err && user) { 
       res.json({ "success": true, "msg": "user existed" }); 

     } 
     else { 

      var nick = new User({name: "Nick" }); 
      nick.save(function(err){ 
       if(!err) 
        res.json({ "success": true, "msg": "user created" }); 
      }) 

     } 
    }); 
}); 
+0

Si prega di aggiungere ulteriori informazioni su ciò che è cambiato e perché – yergo

+0

se (! Err && utente) questa condizione funzionerà se non si è verificato alcun errore o ottenere l'utente. Se nessun utente si trova in db, la funzione else funzionerà e creerà un nuovo utente. –

2

Ecco il codice e funziona. Ho modificato solo lo module.exports con var User per raccogliere il codice in una singola pagina.

Quindi, potrebbe esserci un altro problema?

Buona fortuna ...

var express = require('express') 
var mongoose = require('mongoose') 
var mongoDBUrl = "mongodb://1.0.0.1:27027/tests" 

var app = express() 

var Schema = mongoose.Schema; 
var User = mongoose.model('User', new Schema({ 
    name: String, 
    password: String, 
})); 

/* Mongoose Database connection */ 
mongoose.connect(mongoDBUrl) 
var db = mongoose.connection 
db.on('error', console.error.bind(console, 'Mongo connection error:')) 
db.once('open', function (callback) { 
    console.log("MongoDB connection has established") 
}) 

app.get('/setup', function (req, res) { 
    User.findOne({ name: "Nick" }, function (err, user) { 

     if (user == undefined) { 

      var nick = new User({ 
       name: "Nick", 
      }).save(); 

      res.json({ "success": true, "msg": "user created" }); 
     } else { 
      res.json({ "success": true, "msg": "user existed" }); 
     } 
    }); 
}); 

app.get('/users', function(req, res) { 
console.log("/user works") 

    User.find({}, function(err, user) { 
     res.json(user); 
    }); 
}); 


app.listen(1337, function() { 
    console.log('node-app is listening HTTP port 1337') 
}) 

Postman risultati;

enter image description here

3

Il save() funzione che avete chiamato non è corretto, e segue il modello di altre lingue, piuttosto che Node.js.

Il modo in cui funziona Node.js è totalmente diverso da altri linguaggi come Java, PHP, Ruby, ASP.net e ecc Javascript è del tutto asincrono in natura, e Node.js è migliorata su di esso come Event-driven e non -blocco I/O. Quindi l'esecuzione del codice non si sposta a meno che non abbia ricevuto una risposta dalla funzione in cui si trova.

Pertanto, dopo l'esecuzione del metodo save(), risponde con una funzione di callback inviando una risposta di completamento a node.js in modo che possa attivare altre esecuzioni. Il codice corretto sarà

var user = new User({name: 'Nick'}); 
user.save(function(err, savedUser) { 
    if(err) return res.send(err); 
    return res.json({'message': 'User created!', user: savedUser}); 
}); 

Quindi, come si può vedere, che non appena il metodo save() completa, risponde di nuovo la risposta cioè err e savedUser in un callback anziché restituirli, e ogni singolo di il codice dopo il metodo di salvataggio verrà scritto all'interno di tale callback.

Se prendiamo il codice per un minuto e analizzare quale sia il problema,

var nick = new User({ 
    name: "Nick", 
}).save(); 

res.json({ "success": true, "msg": "user created" }); 

quando il metodo save() viene chiamato, Node.js invia i dati con trigger di inserimento a MongoDB, e si muove con il resto dell'esecuzione del codice. E quel codice sta stampando "successo" anche se i dati non vengono ancora salvati. Quindi quasi ogni metodo in Node.js ha un callback in quanto è l'ultimo parametro che invia un'indicazione di completamento.