我正在尝试检查提供 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/

10-15 23:10