我有以下代码(没有按预期工作):
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(...)里面。
你知道如何让文件回归'结果'变量?
答案 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
});
});
}