2015-11-26 10 views
8

Zapełniam mój DB niektórymi fałszywymi danymi, do których próbuję dodać użytkownika. Obiekt użytkownika jest tworzony, ale żadna z właściwości nie jest zapisywana ... co słychać?Dlaczego MongoDB nie zapisuje moich właściwości

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" }); 
     } 
    }); 
}); 

wywoływanie tego zwraca "utworzony użytkownik". Oto moja metoda na wyjście wszyscy użytkownicy:

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

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

Wyjście Oto

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

Gdzie Próbowałem dodać „Nicka” kilka razy noe ... każde wejście? : D

Mój model Mongoose, znajduje się w osobnym pliku Model.js z innymi modelami:

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

Zmień zapis na '.save (funkcja (err, użytkownik) {console.log (err)})', aby sprawdzić, czy wystąpił błąd – Molda

+0

Skąd pochodzi obiekt użytkownika? Czy używasz mangusty? – tmuecksch

+0

Brak błędów i używam mangusty tak – Jason94

Odpowiedz

2

Trzeba zdefiniować nazwa klucz w użytkownika schematu za to zostać zapisane.

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

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

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

Tak, zapomniałem dodać, ale dodałem klucz nazwy do schematu. Czy mogę mieć wiele schematów w tym samym pliku? Ponieważ teraz mam wszystkie moje "modele" w pliku Models.js. Obejmuje to użytkownika dla jednego, a także innych. – Jason94

+0

Tak, możesz mieć wszystkie "modele" w tym samym pliku, ale nie jest to zalecane. Oznacz także odpowiedź jako zaakceptowaną, jeśli pomogła ci rozwiązać problem. –

+0

To nie rozwiązało mojego problemu, zapomniałem dodać kod. W przeciwnym razie "Użytkownik" w ogóle by nie działał. – Jason94

5

Biorąc masz nazwę w was użytkownika schematu, trzeba także czekać aż do save() zapytanie jest zakończone, a następnie wysłać odpowiedź:

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

Dlaczego muszę czekać? Przechodzę kilka sekund pomiędzy wysyłam/instaluję i/users – Jason94

+2

Ponieważ metoda save() jest asynchroniczna i przed wysłaniem odpowiedzi powodzenia musisz upewnić się, że nie ma błędów i dokument został wstawiony pomyślnie. –

4

Spróbuj z tym kodem:

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

Proszę podać więcej informacji o tym, co zostało zmienione i dlaczego – yergo

+0

jeśli (! Err && user) ten warunek zadziała, jeśli nie wystąpił błąd lub nie dostanie użytkownika. Jeśli żaden użytkownik nie znajdzie w db, to funkcja else zadziała i utworzy nowego użytkownika. –

2

Oto Twój kod i działa. Zmieniłem tylko module.exports z var User z powodu zebrania kodu na jednej stronie.

Może być inny problem?

Powodzenia ...

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 wyniki;

enter image description here

3

SAVE() funkcji, którą nazwali jest nieprawidłowy, a następujący wzór innych językach niż Node.js.

Sposób działania Node.js jest zupełnie inny niż w innych językach, takich jak Java, PHP, Ruby, ASP.net i itd. JavaScript jest całkowicie asynchroniczny, a Node.js ulepszyło go jako oparty na zdarzeniach i nie -blokowanie wejść/wyjść. Tak więc wykonanie kodu nie jest kontynuowane, dopóki nie otrzyma odpowiedzi od funkcji, w której się znajduje.

Dlatego po wykonaniu metody save(), odpowiada ona ponownie za pomocą funkcji wywołania zwrotnego wysyłającej odpowiedź o zakończeniu do pliku node.js, dzięki czemu może wywołać inne wykonania. Poprawny kod będzie

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}); 
}); 

Więc jak widać, że jak tylko zakończy metoda save(), reaguje z powrotem odpowiedź tj err i savedUser w zwrotnego zamiast ich powrocie, a każdy z kod po metodzie zapisu zostanie zapisany wewnątrz tego wywołania zwrotnego.

Jeśli weźmiemy swój kod na minutę i analizować to, co jest problem,

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

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

gdy save() wywoływana jest metoda, node.js wysyła dane wraz z wkładką wyzwalacz MongoDB, i porusza z resztą wykonania kodu. Ten kod drukuje "sukces", nawet jeśli dane nie są jeszcze zapisywane. Dlatego prawie każda metoda w Node.js ma wywołanie zwrotne jako ostatni parametr, który wysyła wskazanie zakończenia.