2017-04-20 82 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。仍在挣扎 –