Цель, которую я хочу достичь, состоит в том, чтобы выполнить поиск в моей базе данных, найти нужные мне результаты и сохранить их в переменной, чтобы я мог использовать их на более позднем этапе в программе.
Я создал нового человека и успешно сохранил его в своей базе данных в соответствии с приведенным ниже кодом:
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
mongoose
Model.find()
возвращает массив. ИспользуйтеfindOne(...)
. Кроме того, вам не нужен обратный вызов при использованииasync\await
.