2017-12-30 36 views
2

Ich kodiere einen Server mit Node.js und ExpressJS. Meine Datenbank ist MongoDB, für die ich MongooseJS als Middleware verwende.Ist es möglich, eine benutzerdefinierte Mungo-Abfragefunktion zu erstellen?

Der Server verfügt über viele Endpunkte und fast jeder von ihnen hat den gleichen Code am Anfang - eine Abfrage an die DB-Geräte abzurufen, die gewählten Zimmer zugewiesen wurden. Vereinfacht Code Wiederholung ist unter:

Room 
     .findOne({ _id: roomId }) 
     .populate({ 
      path: "deviceGroups", 
      populate: { 
       path: "devices" 
      } 
     }) 
     .exec(() => { 
      Device.findOne({ _id: deviceId }).exec((err, device) => { 
       if (err) { 
        res.send(err); 
       } else { 
        // do anything you need with the results here 
       } 
      }); 
     }); 

Ich weiß, dass die Abfragen asynchron sind, also wenn ich etwas mit der Abfrage Ergebnisse tun möchte ich muss es tun, in der Callback-Funktion die Abfrage. Auch beim Extrahieren der Abfrage zu einer externen Funktion, denke ich, gibt es keine Möglichkeit, Express 'res Objekt zu übergeben, nicht wahr? Es wäre erforderlich, um mögliche Fehler während der Abfragen zu behandeln.

Meine Frage ist: die oben genannten Informationen über asynchronysm bedenkt, ist es möglich, einige benutzerdefinierte Funktion wie die unten zu schaffen, das heißt, die Geräte werden das Abrufen wird? Das Ergebnis der Aufruffunktion der Funktion könnte einer Variablen zugewiesen werden. Ich denke, wenn es überhaupt möglich ist, sollte es mit einigen Versprechungshandlern von JS verpackt werden, richtig?

Was ich erreichen will, ist Menge an wiederkehrenden Code zu reduzieren.

Prototype Funktion:

const getDevice = (roomId, deviceId) => { 
    Room 
     .findOne({ _id: roomId }) 
     .populate({ 
      path: "deviceGroups", 
      populate: { 
       path: "devices" 
      } 
     }) 
     .exec(() => { 
      Device.findOne({ _id: deviceId }).exec((err, device) => { 
       return device; 
      }); 
     }); 
}; 

Antwort

1

Sie ein Versprechen schaffen kann, wenn Room.exec nicht bereits etwas zurück, die ein then und catch

function getDivice(roomId){ 
    return new Promise(
    (resolve,reject)=> 
     Room 
     .findOne({ _id: roomId }) 
     .populate({ 
      path: "deviceGroups", 
      populate: { 
       path: "devices" 
      } 
     }) 
     .exec(() => { 
      Device.findOne({ _id: deviceId }).exec((err, device) => { 
       if (err) { 
        reject(err); 
       } else { 
       resolve(device); 
        // do anything you need with the results here 
       } 
      }); 
     }) 
); 
} 

//call it like this: 
getDivice(someid) 
.then(
    divice=>{ 
    //do something with divice 
    } 
) 
.catch(
    err=>{ 
    //do something with the error 
    } 
) 
+0

Sie danken hat! Alles funktioniert gut! –

Verwandte Themen