当我想在猫鼬中从数据库中查找文档时,函数返回未定义 [重复]

Posted

技术标签:

【中文标题】当我想在猫鼬中从数据库中查找文档时,函数返回未定义 [重复]【英文标题】:function returns undefined when I want to find documents from dababase in mongoose [duplicate] 【发布时间】:2018-01-04 20:50:47 【问题描述】:

正如我所说,我想创建一个函数,该函数具有参数、用户名和电子邮件。如果其中一个在数据库中,则用户无法注册。

function checkAll(username, email) 
  let num = 0;
  User.find(, (err, result) => 
    if (err) throw err;
    for (let i = 0; i < result.length; i++) 
     if (username === result[i].username || email === result[i].email) 
        num++;
      
    
    db.close();
    if (num == 0) 
      return true;
    
    return false;
  );


console.log(checkAll("test", "test@test.com"));

我知道User.find() 是一个异步函数,它有第二个参数是回调,但我的问题是:为什么它返回未定义??

【问题讨论】:

因为它是一个异步函数,不能像异步函数那样返回 【参考方案1】:

函数checkAll在触发find操作的回调之前完成执行,并且由于您没有从checkAll返回任何内容,因此记录了undefined

这应该更清楚:

function checkAll(username, email) 
  let num = 0;
  User.find(, (err, result) => 
    console.log('here');
    if (err) throw err;
    for (let i = 0; i < result.length; i++) 
     if (username === result[i].username || email === result[i].email) 
        num++;
      
    
    db.close();
    if (num == 0) 
    console.log('now here');
      return true;
    
    console.log('or mebbe here');
    return false;
  );


console.log(checkAll("test", "test@test.com"));

你会看到undefined,然后是here,然后是now hereor mebbe here

【讨论】:

【参考方案2】:

您的外部函数checkAll 返回undefined,因为它没有返回语句。只有你的内部函数,你的 mongo 查询的回调。由于查询的异步性质,您不能简单地返回 true 或 false。您的选择基本上是这样的:

checkAll 传递一个(或两个)回调:

function checkAll(username, email, cb) //...
function checkAll(username, email, cb_success, cb_fail) //...

您在查询回调中使用 true 或 false 调用 cb,将执行发送回原始调用站点。

使用承诺:

function checkAll(username, email)
    return new Promise((resolve, reject)=> 
        User.find($or: [username, emai], (err, result)=>
            if(result) reject('User exists');
            else resolve('Username/ email free');
        );
    ;


// Usage:
checkAll('alice', 'test@example.com').then(create_user, user_exists);

其中create_user 是处理成功情况的函数,user_exists 是处理失败情况的函数。

【讨论】:

谢谢,效果很好。 太棒了!如果这是您要使用的解决方案,请accept

以上是关于当我想在猫鼬中从数据库中查找文档时,函数返回未定义 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过填充字段在猫鼬中查找文档?

如何通过填充字段在猫鼬中查找文档?

当我需要用和子句分隔查询时,在猫鼬中有两个“或”子句[重复]

通过在猫鼬中填充匹配结果来查找文档

如何在猫鼬中进行原始 mongodb 操作?

如何在猫鼬中进行原始 mongodb 操作?