Javascript 节点将值从一个模块传递到另一个模块

Javascript 节点将值从一个模块传递到另一个模块,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,在我的自定义模块中,我有一个方法,它将查询数据库并查找我的数据库中是否存在用户名。我希望返回一些值,以便在更高级别中知道查询结果 var findUserbyUsername=function(username) { db.users.find({email:username},function(err,result) { if(err|!username) {console.log('username not found'); return 0;}

在我的自定义模块中,我有一个方法,它将查询数据库并查找我的数据库中是否存在用户名。我希望返回一些值,以便在更高级别中知道查询结果

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('xxxx@gmail.com');
但不幸的是我没有定义。。。。
有人能帮我解决这个问题吗?或任何其他建议?

您的
findUserbyUsername
函数不会返回任何内容,这就是为什么您会得到
未定义的
。因为数据库操作在节点中是异步的,所以不能返回任何有意义的内容并通过回调进行工作。按如下方式更改代码:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})
然后像这样使用它:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})
(注意:我还修复了您的条件
if(err |!username)
,因为
是位运算符,您实际上需要
|
逻辑运算符)


(编辑:向回调中添加了事实上的标准
err
参数)

您的
findUserbyUsername
函数不返回任何内容,这就是您得到
未定义的
的原因。因为数据库操作在节点中是异步的,所以不能返回任何有意义的内容并通过回调进行工作。按如下方式更改代码:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})
然后像这样使用它:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})
(注意:我还修复了您的条件
if(err |!username)
,因为
是位运算符,您实际上需要
|
逻辑运算符)


(编辑:在回调中添加了事实上的标准
err
参数)

这是一个异步代码,当然不会返回任何内容。您可能需要以下内容:

app.js:

dbutil.findUser( 'xx@gmail.com', 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
       }
    } );
} );

这是一个异步代码,当然不会返回任何内容。您可能需要以下内容:

app.js:

dbutil.findUser( 'xx@gmail.com', 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
       }
    } );
} );

问题是您的函数中有一个异步请求,因此db.users.find中的返回在错误的范围内,并且永远不会返回到您的请求

您需要将回调函数作为第二个参数传递,因此代码如下所示:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})
然后您可以这样调用函数:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})

问题是您的函数中有一个异步请求,因此db.users.find中的返回在错误的范围内,并且永远不会返回到您的请求

您需要将回调函数作为第二个参数传递,因此代码如下所示:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})
然后您可以这样调用函数:

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('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});
var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;
dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})

嘿不要忘记
err
参数,这是节点中的一个标准:-)之后我将删除我的答案。很好:)只是为了挑剔,为什么不保持一致,使用
err
而不是
null
?顺便说一句,看起来我不能删除一个“已接受的答案”,抱歉:(它看起来更明确,可读性更强。说明您已经确定在这一点上没有错误。嘿!别忘了
err
参数,节点中的一个标准:-)我会在那之后删除我的答案。很好:)只是吹毛求疵,为什么不保持一致并使用
err
而不是
null
?顺便说一句,看起来我不能删除一个“已接受的答案”,抱歉:(它看起来更清晰易懂。表明你已经确定在那一点上没有错误。我理解原因。谢谢大家。我理解原因。谢谢大家。