Проверьте, существует ли файл в mongodb, используя es7 async/wait
Я пытаюсь проверить, существует ли пользователь с 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
всегда undefined (хотя я думаю, что это не должно быть так, потому что await
ждет конца асинхронного вызова, правильно?)
Мне просто нужна моя функция, чтобы вернуть логическое значение, а не 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 } }
Любые идеи, почему это так?
Ответы
Ответ 1
Хорошо, вот как я начал работать:
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
.