2012-06-07 152 views
0

我的自定义模块中我有这样的方法,将查询数据库,并发现,如果在我的数据库中存在的用户名。我想要返回一些值,所以在上层我会知道查询结果。从的NodeJS一个模块传递值到另一个模块

var findUserbyUsername=function(username) 
{ 
    db.users.find({email:username},function(err,result) 
    { 

     if(err|!username) {console.log('username not found'); return 0;} 
     else return 1; 
    } 
    ); 
} 
module.exports.findUser=findUserbyUsername; 

在app.js我会请这样

var lt=dbutil.findUser('[email protected]'); 

上面的方法,但不幸的是我得到了不确定.... 谁能帮助我解决这个?还是有其他建议?

+0

我理解的原因。谢谢大家。 –

回答

2

这是一个异步代码,当然它不会返回任何东西。您可能需要执行以下操作:

app.js:

dbutil.findUser('[email protected]', function(err, data) { 
    if (err) throw err; 
    // Handle the datas returned "data" 
}); 

模块:

var findUserByUserName = function(username, callback) { 
    db.users.find({ email: username }, function(err, result) { 
     if (err || !username) { 
      console.log('username not found'); 

      // Call the function passed as parameter 
      callback(err); // You give "undefined" as second parameter 
     } 
     else { 
      callback(err, result); // You give the datas back 
     } 
    }); 
}); 
2

findUserbyUsername功能不返回任何东西,这就是为什么你undefined。由于数据库操作在Node中是异步的,因此不能返回任何有意义的东西并通过回调工作。改变你的代码是这样的:

var findUserbyUsername = function(username, callback) { 
    db.users.find({ email: username }, function(err, result) { 
     if (err || !username) { 
      console.log('username not found'); 
      callback(err? err: 'Username not found'); 
     } else { 
      callback(null, whateverYouWantToReturn); 
     } 
    }); 
} 
module.exports.findUser = findUserbyUsername; 

,并使用它像这样:

dbutil.findUser('[email protected]', function(err, result) { 
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error 
}); 

注:我也修正了自己的条件if(err|!username),因为|是位运算符和你真正想要的||逻辑运算符)

(编辑:添加实际标准err参数到回调)

+0

嘿!请不要忘记'err'参数,它是节点中的一个标准:-)之后我会删除我的答案。 –

+0

好:)只是鸡蛋里挑骨头,为什么不保持一致,并使用'err',而不是'null'?顺便说一句,貌似我不能删除“接受的答案”,抱歉:( –

+0

似乎更加明确和可读性。清楚地表明,你已经确定有在这一点上没有错误。 – lanzz

0

的问题是你有你的函数内部异步请求,所以db.users内部回报.find是在错误的范围内,并且永远不会回到您的请求。

你需要传递一个回调函数作为第二个参数,使代码看起来是这样的:

var findUserbyUsername=function(username, cb) 
{ 
    db.users.find({email:username}, cb); 
} 
module.exports.findUser=findUserbyUsername; 

然后,你可以调用该函数是这样的:

dbutil.findUser('[email protected]', function(err, username) { 
    if (err) { 
     // Handle err 
    } else { 
     // Handle username 
    } 
}) 
相关问题