2016-09-19 95 views
1

問題返回單個字段從MongoDB的文檔

你好。我只是在Node.js和MongoDB中做一個簡單的測試項目,並且從文檔中獲取數據時遇到了一些麻煩。我做了一個函數來從數據庫中檢索數據並將該函數放入模塊中。請參閱我的文檔格式以及我的代碼如下。我真的不知道問題是什麼。

文檔格式

{ 
    "email" : "[email protected]", 
    "name" : "John Smith", 
} 

功能代碼

module.exports = { 
    GetInfo: function(MongoClient, assert, baseValues, targetField) { 
     var result = ""; 
     MongoClient.connect(db_link, function(err, db) { 
      assert.equal(null, err); 
      var doc = db.collection('userdata').find(baseValues); 
      if (doc != null) { 
       result = doc[targetField]; 
      } else { db.close(); } 
     }); 
     return result; 
    }, 
} 

函數調用

var MongoClient = require('mongodb').MongoClient; 
var assert = require('assert'); 
var name = GetInfo(MongoClient, assert, { "email":"[email protected]" }, "name"); 
console.log(name); 

回答

0

你試圖讓回調函數外部造成

嘗試這樣

UPDATE 19/09/16

功能代碼

module.exports = { 
    GetInfo: function(MongoClient, assert, baseValues, targetField, next) { 
     MongoClient.connect(db_link, function(err, db) { 

      assert.equal(null, err); 
      var collection = db.collection('userdata'); 

      collection.findOne(baseValues, function(err, doc) { 

       assert.equal(null, err); 
       if (doc != null) { 
        var result = doc[targetField]; 
        next(result); // err to callback missing 
       } else { 
        db.close(); // callback missing 
       } 
      }); 
     }); 
    } 
} 

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findOne

函數調用

var MongoClient = require('mongodb').MongoClient; 
var assert = require('assert'); 
var name = GetInfo(MongoClient, assert, { "email":"[email protected]" }, "name", function(res) { 

    console.log(res); 
}); 
+0

還是用'變種名稱=的GetInfo(不能獲取名稱MongoClient, assert,{「email」:「[email protected]」},「name」);''你應該嘗試類似promise或generator。 –

+0

請嘗試更新版本 – hex7c0

0

由於連接數據庫和查詢是異步I/O操作,所以當你試圖連接到MongoDB中,該return result;已經執行。

這是一個承諾的版本,你可以試試:

功能代碼

module.exports = { 
    connect: function(MongoClient) { 
    return new Promise(function(resovle, reject) { 
     MongoClient.connect(db_link, function(err, db) { 
     if(err) 
      reject(err); 
     else 
      resovle(db); 
     }); 
    }); 
    }, 
    findOne: function(db, baseValues) { 
    return new Promise(function(resovle, reject) { 
     db.collection('userdata').findOne(baseValues, function(err, doc) { 
     if(err) 
      reject(err); 
     else 
      resovle(doc); 
     }); 
    }); 
    } 
}; 

函數調用

var MongoClient = require('mongodb').MongoClient; 
connect(MongoClient) 
    .then(function(db) { 
    return findOne(db, { "email":"[email protected]" }); 
    }) 
    .then(function(doc) { 
    if(doc) { 
     console.log(doc.name); 
    } 
    }) 
    .catch(console.log); 
相關問題