2016-11-10 12 views
0

Ich bekomme eine Null-Antwort von Mongoose FindOne, wenn ich als Parameter ein dateString Argument verwende. Ich benutze nodejs und mongoose.Mongoose FindOne funktioniert nicht

Hier ist mein Code:

var Service = app.models.service; 
controller.newService = function(req, res) { 
var date = new Date(); 
var dateString = date.toString(); 
var countHours = 1; 
var user = req.decoded; 
var findProfessional = function(){ 
    console.log(countHours); 
    console.log(user._doc._id); 
    console.log(req.body.service[0].tipo); 
    console.log(dateString); 
    Service.findOne({ 
     tipo: req.body.service[0].tipo, 
     client: user._doc._id, 
     dateOpen: dateString 
    }, function(err, service) { 
     console.log(service); 
     if (err) throw err; 

     if (!service) { 
     console.log("service not found"); 
     } else if (service) { 
     if (service.status == 'open' && countHours <= 24) { 
      setTimeout(function(){ 
      Professional.find({ 
       'services.name': req.body.service[0].tipo 
      }, function(err, professional) { 
       if (err) throw err; 

       if (professional) { 
       DO STUFF      
       } else { 
       DO STUFF 
       res.json({ success: false, message: 'No professionals found' }); 
       }; 
      }); 
      countHours++; 
      findProfessional(); 
      }, 10000); 
     } else if (service.status != 'open'){ 
      // DO STUFF 
     } else if (countHours > 24){ 
      //DO STUFF 
     } 
     } 
    }); 
    }; 

Hier ist mein Schema:

var schemaServices = mongoose.Schema({ 
    tipo: { 
     type: String, 
     required: true 
    }, 
    client: { 
     type: String, 
     required: true 
    }, 
    dateOpen: { 
     type: String, 
     required: true 
    }, 
    dateClose: { 
     type: String, 
    }, 
    professional: { 
     type: String 
    }, 
    status: { 
     type: String, 
     required: true 
    }, 
    services: { 
     type: [{name: String, 
      preco: String, 
      tipo: String, 
      tipoCusto: String, 
      pedido: String}], 
     required: true 
     }, 
    visitDay: { 
     type: String 
    }, 
    visitHour: { 
     type: String 
    }, 
    address: { 
     type: [{cep: String, 
      street: String, 
      number: String, 
      comp: String, 
      district: String, 
      city: String}], 
     required: true 
    } 
    }); 

schemaServices.index({client: 1, tipo: 1, dateOpen: 1}, {unique: true}); 

Was meinen Code?

Wenn eine Anfrage an diese Route gestellt wird, speichert der Knoten den neuen Dienst und sucht nach einem Experten, der die Aufgabe erledigt. Und es sucht weiter, bis der Timer countHours 24 erreicht oder einen Fachmann hat, um die Arbeit zu erledigen. Der Server speichert den Dienst ohne Probleme, aber ich muss den Status des Dienstes überprüfen, der gerade gespeichert wurde, und ich stehe vor diesem Problem von Service.findOne() Nullwerte zurückgeben, wenn ich dateOpen: dateString.

Das Problem ist

Service.findOne({ 
     tipo: req.body.service[0].tipo, 
     client: user._doc._id, 
     dateOpen: dateString 
    } 

immer ein Nullwert wie Dienst vorhanden kehrt nicht. Aber wenn ich die gleiche Abfrage in Prompt mit Mongo gemacht habe, habe ich den richtigen Service.

ich einige Tests gemacht und beobachtete einige Dinge:

- Der console.logs druckt in Ordnung, was es gedruckt werden soll.
-Wenn ich entfernen Sie die dateOpen: datestring von Argumenten in Service.findOne() funktioniert es

Also, ich glaube, dass der Fehler mit dem datestring verwandt ist, aber ich kann nicht sehen, was es ist.

Hoffnung jemand kann mir helfen,

Vielen Dank im Voraus!

+0

Sie speichern das Datum als Zeichenfolge. Überprüfen Sie, ob sie das gleiche Format haben. Andernfalls wird das gewünschte Ergebnis nicht zurückgegeben. Ich empfehle, das Datum als Datumstyp zu speichern. Dann könnten Sie das Date() - Objekt direkt in der Abfrage verwenden, um das Ergebnis zu finden. – Sohel

+0

Yep Blick auf Ihre Dokumente und die Ergebnisse Ihrer console.log (dateString). Fühlen Sie sich frei, ein Beispiel in Ihrer Frage zu setzen. – dyouberg

+0

Danke Jungs, gerade gelöst. Die Formate waren die gleichen. –

Antwort

0

Gerade mein eigenes Problem gelöst.

Das Problem war, dass die Ausführungszeit des Knotens war schneller als die .save-Methode von Mongo, nur den Aufruf von findProfessional() in den Erfolg Callback der .save-Methode geändert. So ist das:

 newService.save(function(err){ 
    if (err) throw err; 
    console.log('Service saved successfully'); 
    newService.save(findProfessional()) 
    }); 

Jetzt funktioniert es richtig.

Verwandte Themen