2017-12-15 2 views
-1

Ich habe zwei Dateienmongodb async NodeJS externe Datei mit Funktionen - Rückkehr: undefinied

server.js

(function() { 
    var x = modules.dbFind('7'); 
    setTimeout(function() { 
     console.log(x); 
    }, 100); 
})(); 

und meine modules.js

var dbFind = (id) => { 
    console.log("dbFIND function in use!"); 
    MongoClient.connect(url, function(err, db) { 
     if (err) throw err; 
     db.collection("users").findOne({id:id}, function(err, result) { 
      if (err) throw err; 
      console.log(JSON.stringify(result)); 
      return(result); 
      db.close(); 
     }); 
    }); 
}; 

ich RESULT übergeben wollen aus Module in die Server-Datei und lesen Sie es dort, aber x = nicht definiert. Ergebnis in modules.js - console.log (Ergebnis) zeigt alles wie ich möchte.

Ich weiß, dass das Problem im Lesen von X ist, bevor das Ergebnis dort ankommt - aber ich versuche schon paar Tage und ich habe keine Ahnung, wie ich es lösen soll.

+0

Sie sollten Async warten, um den Wert x zu erhalten. Wenn Sie den x-Wert zugewiesen haben, wurde dbFind nicht beendet. – sungyong

Antwort

1

Ändern Sie wie folgt. Wenn Sie Versprechen/dann verwenden, müssen Sie nicht als setTimeout warten.

server.js

(async function() { 
    modules.dbFind('7') 
      .then((result)=> { 
      console.log(result); 
      }); 
})(); 

modules.js

function dbFind(id) { 
    return new Promise((resolve, reject)=> { 
     console.log("dbFIND function in use!"); 
     MongoClient.connect(url, function(err, db) { 
      if (err) reject(err); 
      db.collection("users").findOne({id:id}, function(err, result) { 
       if (err) reject(err); 
       console.log(JSON.stringify(result)); 
       resolve(result); 
       db.close(); 
      }); 
     });  
    }); 
} 
+0

Konsole zeigt "Versprechen ausstehend" – BatOOn

+0

mein Tippfehler in server.js behoben. Versuch es noch einmal. – sungyong

+0

Es funktioniert wie erwartet! Danke vielmals! Jetzt muss ich studieren, was genau passiert;) – BatOOn

0

Da dieses Versprechen Sie nur async/await markiert ist und die Tatsache, MongoClient Versprechen enthält verwenden können. Ansonsten ist dies ein Duplikat this question:

const dbFind = async (id) => { 
    console.log("dbFIND function in use!"); 
    const db = await MongoClient.connect(url)); // no callback = return promise 
    try { 
    let user = db.collection("users").findOne({id}); // shorthand {id:id} 
    return user; 
    } finally { 
    db.close(); 
    } 
} 

Dies würde Sie tun:

(async() => 
    let found = await modules.dbFind('7'); 
    console.log(found); 
})() 

Beachten Sie auch, sollten Mongo Verbindungen einmal für jede Anforderung pro App gegen persistent und geöffnet werden.

+0

gibt es einige Fehler, aber selbst ich korrigiere sie bekomme ich in der Konsole: UnhandledPromiseRejectionWarning: Unbehandelte Versprechen Ablehnung (Ablehnung id: 1): TypeError: module.dbFind ist keine Funktion Was bedeutet das? Es gibt nicht viel Hilfe in Google für diesen Fehler – BatOOn

+0

Sie benötigten die andere Datei nicht als Modul –