node.js:如何返回回调函数的值?

时间:2016-11-15 11:22:33

标签: node.js callback

我有以下代码(没有按预期工作):

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.toString(); // returns to the function that calls the callback
    });
  });
}

功能' get_document'应该返回存储在' myinterviews'中的文件。采集。问题是该行返回docs [0] ...'返回col.find(调用回调的函数)而不是变量' result'在app.get(...)里面。

你知道如何让文件回归'结果'变量?

2 个答案:

答案 0 :(得分:1)

你应该看看promise api。

“get_document”函数应返回一个新的promise,带有resolve和reject函数回调(成功/失败)。

所以,它应该看起来像这样:

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.toString()); // returns to the function that calls the callback
    });
  });
  );
}

答案 1 :(得分:1)

您的get_document函数异步运行。拨打MongoClient.connect()可能需要一些时间,因此无法立即返回。要返回您在数据库调用之后的值,您必须将回调传递到get_document函数。所以看起来应该是这样的:

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.toString()); // returns to the function that calls the callback
    });
  });
}