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