node.js: comment retourner une valeur d’une fonction de rappel?

J’ai le code suivant (cela ne fonctionne pas comme prévu):

var express = require('express') var app = express() var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost:27017/interviews'; app.get('/', function(req, res){ var result = get_document(res); res.send( result // show the results of get document in the browser //) console.log("end"); }); app.listen(3000, function(req, res) { console.log("Listening on port 3000"); }); function get_document() { MongoClient.connect(url, function(err, db) { var col = db.collection('myinterviews'); var data = col.find().toArray(function(err, docs) { db.close(); return docs[0].name.toSsortingng(); // returns to the function that calls the callback }); }); } 

La fonction ‘get_document’ est supposée renvoyer les documents stockés dans la collection ‘myinterviews’. Le problème est que la ligne ‘return docs [0] …’ retourne à col.find (qui est la fonction qui a appelé le rappel) et non à la variable ‘result’ dans app.get (…).

Savez-vous comment faire en sorte que les documents reviennent à la variable ‘résultat’?

Vous devriez jeter un oeil à l’API de promesse.

la fonction “get_document” devrait renvoyer une nouvelle promesse, avec des fonctions de rappel et de rejet de la fonction (succès / échec).

Donc, ça devrait ressembler un peu à ça:

 var express = require('express') var app = express() var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost:27017/interviews'; app.get('/', function(req, res){ var result = get_document(res).then(function (doc) { res.send( doc); }); // show the results of get document in the browser //) console.log("end"); }); app.listen(3000, function(req, res) { console.log("Listening on port 3000"); }); function get_document() { return new Promise( function (resolve, reject) MongoClient.connect(url, function(err, db) { var col = db.collection('myinterviews'); var data = col.find().toArray(function(err, docs) { db.close(); resolve(docs[0].name.toSsortingng()); // returns to the function that calls the callback }); }); ); } 

Votre fonction get_document s’exécute de manière asynchrone. L’appel à MongoClient.connect() peut prendre un certain temps et ne peut donc pas être renvoyé immédiatement. Pour renvoyer la valeur que vous recherchez à partir de votre appel à la firebase database, vous devez passer un rappel à la fonction get_document . Donc, cela devrait ressembler à quelque chose comme ça:

 var express = require('express') var app = express() var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost:27017/interviews'; app.get('/', function(req, res){ var result = get_document(function(result) { res.send(result); console.log("end"); }); }); app.listen(3000, function(req, res) { console.log("Listening on port 3000"); }); function get_document(done) { MongoClient.connect(url, function(err, db) { var col = db.collection('myinterviews'); var data = col.find().toArray(function(err, docs) { db.close(); done(docs[0].name.toSsortingng()); // returns to the function that calls the callback }); }); }