Подтвердить что ты не робот

Проверьте, существует ли файл в 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 } }

Любые идеи, почему это так?

4b9b3361

Ответ 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.