Ошибка при доступе к коллекции mon go с использованием клиента mon go асинхронно - PullRequest
1 голос
/ 05 января 2020

Я создал следующий мон go клиентский доступ bootstrap файл:

import { MongoClient } from "mongodb";

let db = null;

// Connect to mongo
const uri = "mongodb://localhost/mydb";
const opts = { useUnifiedTopology: true };

const connect = async () => {
    console.log("Connecting to database...");

    let client = await MongoClient.connect(uri, opts).catch(error => {
        console.log("Error connecting to database: " + err);
    });

    if (client) {
        console.log("Database connected.");
        db = client.db("mydb");
    }

    return client;
};

// Get database connection
const getDb = async () => {
    if (!db) await connect();

    return db;
};

// Get Collection
const getCollection = async name => {
    let database = await getDb();

    let collection = await database.collection(name);

    if (!collection)
        throw new Error("(mongo) Cannot get collection named " + name);

    return collection;
};

export { db, getCollection };

При попытке первого доступа к коллекции в другой программе:

import { getCollection } from "./mongoutils";

const init = async () => {
    let user = await getCollection("users").findOne({ name: "Josh"});

    console.log("User found!");
}

Я получаю следующую ошибку:

UnhandledPromiseRejectionWarning: TypeError: (0 , _mongo.getCollection)(...).findOne is not a function

Как правильно исправить эту ошибку, сохранив всю структуру async/await?

1 Ответ

1 голос
/ 05 января 2020

Функция asyn c возвращает обещание, а не разрешенные данные.

Здесь getCollection() - это асин c функция. Таким образом, вызов getCollection("users") вернул бы обещание, а не сам разрешенный сбор, поскольку я предполагаю, что вы ожидаете. Правильный способ сделать это:

import { getCollection } from "./mongoutils";

const init = async () => {
    let userCollection = await getCollection("users");
    try {
      let user = await userCollection.findOne({ name: "Josh"})
      console.log("User found!");
    } catch (e) { 
      console.log("User not found!");
    }
}
...