我正在尝试检查提供 email
的用户是否存在于集合 users
中,但我的函数在每次调用时都返回 undefined 。我使用 es6 和 async/await
来摆脱大量的回调。这是我的函数(它在一个类中):
async userExistsInDB(email) {
let userExists;
await MongoClient.connect('mongodb://127.0.0.1:27017/notificator', (err, db) => {
if (err) throw err;
let collection = db.collection('users');
userExists = collection.find({email: email}).count() > 0;
console.log(userExists);
db.close();
});
console.log(userExists);
return userExists;
}
所以,
console.log
调用中的第一个 .connect
总是返回 false
因为 .find
的返回值不是一个数组,它看起来像一个巨大的对象:{ connection: null,
server: null,
disconnectHandler:
{ s: { storedOps: [], storeOptions: [Object], topology: [Object] },
length: [Getter] },
bson: {},
ns: 'notificator.users',
cmd:
{ find: 'notificator.users',
limit: 0,
skip: 0,
query: { email: '[email protected]' },
slaveOk: true,
readPreference: { preference: 'primary', tags: undefined, options: undefined } },
options:
........
........
而最后的
console.log
总是未定义的(虽然我认为不应该这样,因为 await
等待异步调用结束,对吧?)我只需要我的函数返回一个 bool 值,而不是
Promise
之类的。有人可以帮我吗?
更新 1
console.log(collection.findOne({email: email}));
里面的 .connect
返回这个: { 'Symbol(record)_3.ugi5lye6fvq5b3xr':
{ p: [Circular],
c: [],
a: undefined,
s: 0,
d: false,
v: undefined,
h: false,
n: false } }
更新 2
似乎这是我对 es7
async/await
了解不足的问题。现在
.connect
中的代码返回所需的值。async userExistsInDB(email) {
let userExists;
await* MongoClient.connect('mongodb://127.0.0.1:27017/notificator', async(err, db) => {
if (err) throw err;
let collection = db.collection('users');
userExists = await collection.find({email: email}).limit(1).count() > 0;
db.close();
});
console.log(userExists); // <--- this is not called at all
return userExists;
}
但是,现在根本不执行
console.log
或 .connect
调用之后的任何内容。现在,每次我在某处调用
userExistsInDB()
函数和 console.log
的结果时,我都会得到这个: { 'Symbol(record)_3.78lmjnx8e3766r':
{ p: [Circular],
c: [],
a: undefined,
s: 0,
d: false,
v: undefined,
h: false,
n: false } }
任何想法为什么会这样?
最佳答案
好的,这是我的工作方式:
async function userExistsInDB(email, password) {
let db = await MongoClient.connect('mongodb://127.0.0.1:27017/notificator');
try {
let collection = db.collection('users');
let userCount = (await collection.find(
{
email: email,
password: password
}).limit(1).count());
return userCount > 0;
} finally {
db.close();
}
}
并且因为函数声明中的
async
关键字保证返回值将是 Promise
,因此从该函数中获取真实返回结果的唯一方法是:let result = await this.userExistsInDB(email, password);
在另一个声明为 async
的函数内部。关于node.js - 使用 es7 async/await 检查 mongodb 中是否存在文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33450722/