2017-04-20 118 views
0

我有一個函數,列出所有用戶和角色refrenced組。現在我有其他的功能,採取用戶角色refid並返回組名稱。在嘗試返回姓名時,我收到了待處理狀態。MEAN節點js承諾返回undefinded

function getAll() { 
    var deferred = Q.defer(); 

    db.users.find().toArray(function(err, users) { 
     if (err) deferred.reject(err.name + ': ' + err.message); 

     // return users (without hashed passwords) 
     users = _.map(users, function(user) { 
      //console.log(user); 

      return _.omit(user, ['hash']); 
      }); 
     users = _.map(users, function(user){ 
      refId = {}= user['role'][0]['oid']['_id']; 
      //console.log(typeof refId); 
      user = _.omit(user, ['role']); 
      user.role = userRole.userRole(refId).then(function(err,rid){ 
       if(err){ 
        deferred.reject(err.name+':'+err.message); 
       } 
       deferred.resolve(); 
       console.log(deferred.resolve(rid)); 
       return deferred.promise; 
       console.log(deferred.promise); 
      }); 
      return user; 
      //console.log(user); 

     }) 
     // getRefId(users) 
     //console.log(users); 

    deferred.resolve(users); 
}); 

function userRole(rid){ 
    return new Promise((resolve, reject) => { 
     db.groups.findOne({"_id":rid}, function(err, doc){ 
      if(err){ 
       reject(err.name + ':' + err.message); 

      } 
      if(doc){ 
       resolve({"name": doc.name}); 
       //console.log(doc.name); 
      } 
     }) 
    }) 
} 

回答

0

您要使用與貓鼬或本地Mongo的驅動程序節點,你似乎是在這裏做的承諾,你不必使用new Promise()無處不在。你可以直接使用promise。

請參閱該文檔:

官方的MongoDB Node.js的驅動程序提供了基於這兩個回調以及與MongoDB中允許應用程序採取的ES6的新功能充分利用了基於承諾的互動。

貓鼬異步操作,如.save()和查詢,返回承諾/ A +符合的承諾。這意味着您可以執行諸如MyModel.findOne({})。then()併產生MyModel.findOne({})。exec()(如果您使用的是co)。

取而代之的是:

function userRole(rid){ 
    return new Promise((resolve, reject) => { 
     db.groups.findOne({"_id":rid}, function(err, doc){ 
      if(err){ 
       reject(err.name + ':' + err.message); 

      } 
      if(doc){ 
       resolve({"name": doc.name}); 
       //console.log(doc.name); 
      } 
     }) 
    }) 
} 

你應該能夠使用:

function userRole(rid){ 
    return db.groups.findOne({ _id: rid }); 
} 

或:

const userRole = rid => db.groups.findOne({ _id: rid }); 

現在,在您的版本中有一個問題 - 如果沒有錯誤,承諾永遠不會解決,但返回的doc是虛假的,可能會發生。但是,如果您呼叫的方法首先返回承諾,那麼創建自己的承諾就毫無意義。

即使你想自定義錯誤消息,您仍然可以使用:

function userRole(rid){ 
    return db.groups.findOne({ _id: rid }) 
    .catch(function (err) { 
     return Promise.reject(err.name + ':' + err.message); 
    }); 
} 

或本更現代的語法:

const userRole = rid => db.groups.findOne({ _id: rid }) 
    .catch(err => Promise.reject(`${err.name}:${err.message}`)); 
+0

HI其實我使用mongoskin。仍在掙扎 –