Есть ли способ извлечь значения из базы данных с помощью мангуста и сохранить желаемые результаты в переменной?

avatar
Derryn Nel
1 июля 2021 в 19:23
31
1
0

Цель, которую я хочу достичь, состоит в том, чтобы выполнить поиск в моей базе данных, найти нужные мне результаты и сохранить их в переменной, чтобы я мог использовать их на более позднем этапе в программе.

Я создал нового человека и успешно сохранил его в своей базе данных в соответствии с приведенным ниже кодом:

const mongoose = require('mongoose')


mongoose.connect("mongodb://localhost:27017/testClubDB", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true });

const nameSchema = new mongoose.Schema({
    name: String,
    surname: String
});

const Person = mongoose.model("Person", nameSchema);

const person = new Person({
    name: "John",
    surname: "Doe"
});

person.save(function(err){
    if(!err){
        console.log("Successfully added to DB");
    }
});

Таким образом, в моей базе есть следующая запись:

{
    "_id" : ObjectId("60dd9a95e6eed847b4c985ba"),
    "name" : "John",
    "surname" : "Doe",
    "__v" : 0
}

Я знаком с Model.find() от mongoose, который получает следующее:

Person.find({name:"John"}, function(err, info){
    if(!err){
        info.forEach(function(x){
            var value1 = x.name;
            var value2 = x.surname;
            var data = [value1, value2];
            console.log(data); // this appears in the console ["John","Doe"]
        });
};

Теперь я хочу вернуть эти данные и сохранить их в переменной, ниже приведен пример того, как я надеялся добиться этого:

function getQueryData(name){
    Person.find({name:name}, function(err, info){
        if (!err){
            info.forEach(function(x){
                var value1 = x.name;
                var value2 = x.surname;
                var data = [value1, value2];
                return data
            });
        }
    });
}


var result = getQueryData("John");

console.log(result); // I was expecting ["John", "Doe"] but get undefined

Но приведенное выше привело к результату = undefined, поэтому вместо этого я попытался использовать асинхронную функцию, как показано ниже:

async function getQueryData(name){
    values = await Person.find({name:name}, function(err, info){
        if (!err){
            info.forEach(function(x){
                var value1 = x.name;
                var value2 = x.surname;
                var data = [value1, value2];
            });
        }
    });
}


var result = getQueryData("John");

console.log(result); // It now displays in the console: Promise { <pending> }

Итак, теперь я действительно не уверен, что происходит (я новичок в программировании и кодировании, прежде чем кто-либо осудит). Я думал, что добавление .then() может помочь, но вот что произошло:

var result = getQueryData("John");
result.then((goal) => {
    console.log(goal); // I get two things in my console, Promise pending and undefined. I am guessing this resulted in the Promise pending
});

console.log(result); // and this resulted in the undefined

Теперь я в отчаянии и теперь прибегаю к помощи. Если у кого-нибудь есть какие-либо предложения о том, что я могу сделать, чтобы решить эту проблему, я буду очень признателен!

ПОЖАЛУЙСТА ПОЖАЛУЙСТА ПОМОГИТЕ!

Я попытался использовать Model.findOne() следующим образом:

async function getQueryData(name){
    values = await Person.findOne({name:name}, function(err, info){
        if (!err){
            var data = [info.name, info.surname]
        }
    });
}


var result = getQueryData("John");
result.then((goal) => {
    console.log(goal);
});

console.log(result); // However, still resulted in Promise pending and undefined in the console
Источник
ISAE
1 июля 2021 в 19:27
0

mongoose Model.find() возвращает массив. Используйте findOne(...). Кроме того, вам не нужен обратный вызов при использовании async\await.

Ответы (1)

avatar
Arik
2 июля 2021 в 22:10
0

При вызове асинхронной функции вы обычно хотите поместить await перед ней, например,

let foo = async () => "Foo!";
let stringWithoutAwait = foo(); // Promise;
let stringWithAwait = await foo(); // "Foo"

Некоторые задачи, например обращения к базе данных, могут занимать много времени. Но если бы ваш сервер должен был прекращать обслуживать других пользователей каждый раз, когда вам нужно что-то из базы данных, это был бы ужасный сервер. Вот почему были изобретены асинхронные функции.

Асинхронная функция возвращает значение немедленно, даже до того, как она получит ответ, так что ваш код может продолжать выполняться. Вместо ответа он возвращает обещание дать вам ответ позже. Если вы хотите сделать паузу и подождать, пока обещание не будет разрешено, иначе говоря, функция наконец получит ответ, вам нужно «дождаться» асинхронной функции с ключевым словом await.

Таким образом, ваш код должен выглядеть следующим образом:

let result = await Person.findOne({name: "John"});
console.log(result);

Кроме того, вы можете использовать ключевое слово await только внутри другой асинхронной функции, так что будьте осторожны.