使用 es7 async/await 检查 mongodb 中是否存在文档
Check if document exists in mongodb using es7 async/await
我正在尝试检查集合 users
中是否存在提供 email
的用户,但我的函数在每次调用时都保持 returning 未定义。我使用 es6 和 async/await
来摆脱大量回调。这是我的函数(它在 class 中):
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;
}
因此,.connect
中的第一个 console.log
总是调用 returns false
,因为 .find
的 returned 值不是数组,它是一些巨大的对象,如下所示:
{ 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@example.com' },
slaveOk: true,
readPreference: { preference: 'primary', tags: undefined, options: undefined } },
options:
........
........
而最后的console.log
总是undefined(虽然我觉得不应该这样,因为await
等待异步调用结束,对吧?)
我只需要我的函数 return 一个布尔值,而不是 Promise
或其他东西。
有人可以帮我吗?
更新 1
console.log(collection.findOne({email: email}));
里面的.connect
return是这样的:
{ 'Symbol(record)_3.ugi5lye6fvq5b3xr':
{ p: [Circular],
c: [],
a: undefined,
s: 0,
d: false,
v: undefined,
h: false,
n: false } }
更新 2
看来是我对 es7 的了解不足导致的问题async/await
。
现在 .connect
return 中的代码是所需的值。
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
.
的另一个函数内
我正在尝试检查集合 users
中是否存在提供 email
的用户,但我的函数在每次调用时都保持 returning 未定义。我使用 es6 和 async/await
来摆脱大量回调。这是我的函数(它在 class 中):
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;
}
因此,.connect
中的第一个 console.log
总是调用 returns false
,因为 .find
的 returned 值不是数组,它是一些巨大的对象,如下所示:
{ 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@example.com' },
slaveOk: true,
readPreference: { preference: 'primary', tags: undefined, options: undefined } },
options:
........
........
而最后的console.log
总是undefined(虽然我觉得不应该这样,因为await
等待异步调用结束,对吧?)
我只需要我的函数 return 一个布尔值,而不是 Promise
或其他东西。
有人可以帮我吗?
更新 1
console.log(collection.findOne({email: email}));
里面的.connect
return是这样的:
{ 'Symbol(record)_3.ugi5lye6fvq5b3xr':
{ p: [Circular],
c: [],
a: undefined,
s: 0,
d: false,
v: undefined,
h: false,
n: false } }
更新 2
看来是我对 es7 的了解不足导致的问题async/await
。
现在 .connect
return 中的代码是所需的值。
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
.