Porównaj ceny domen i usług IT, sprzedawców z całego świata

Jak zwrócić wyniki zapytania do zmiennej za pomocą mongoose


Wciąż jestem w fazie uczenia się Node.js i Moongoose i mam scenariusz, w którym
  • Pobieram wartość (ABC) z formularza zgłoszeniowego. To jest nazwa użytkownika
  • Następnie wyszukuję tę nazwę w zbiorze użytkowników (Użytkownik)
  • Pobierz tego użytkownika i zapisz jego ObjectID w innym schemacie (artykule) przy użyciu ref.


Moja logika

:
article.owner = User.findOne({ 'name' : 'ABC' })
.exec(function (err, user){
return user
})

Ale to nie daje żadnych wyników. Odwołałem się do niektórych innych odpowiedzi i wypróbowałem
async.parallel
, ale nadal nie mogę zapisać ABC identyfikatora obiektu użytkownika w schemacie artykułu w
article.owner
.
Proszę zasugeruj mi inne lepsze sposoby.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Gdy Node musi wykonać coś we/wy, na przykład odczytać z bazy danych, zostanie to wykonane asynchronicznie. Metody takie jak
User.findOne
i
Query # exec
nigdy nie zwrócą wyniku z wyprzedzeniem, więc
article.owner
nie będzie poprawnie niezdefiniowany w Twoim przykładzie .
Wynik żądania asynchronicznego będzie dostępny tylko wewnątrz wywołania zwrotnego, które jest wywoływane dopiero po zakończeniu operacji we/wy
article.owner = User.findOne({ name : 'ABC' }) .exec(function (err, user){ 
// User result only available inside of this function!
console.log(user)// => yields your user results
})// User result not available out here!
console.log(article.owner)// => actually set to return of .exec (undefined)

Co to znaczy wykonywać kod asynchronicznie w powyższym przykładzie: kiedy Node.js trafia
article.owner = User.findOne ...
, wykonuje
User.findOne (). Exec ( )
, a następnie przechodzi bezpośrednio do
console.log (article.owner)
zanim
.exec
jeszcze się zakończy.
Mam nadzieję, że pomoże to wyjaśnić sytuację. Przyzwyczajenie się do programowania asynchronicznego zajmuje trochę czasu, ale przy większej praktyce będzie to miało sens

Aktualizacja

aby odpowiedzieć na Twój konkretny problem, jednym możliwym rozwiązaniem byłoby:
User.findOne({name: 'ABC'}).exec(function (error, user){
article.owner = user._id;// Sets article.owner to user's _id
article.save()// Persists _id to DB, pass in another callback if necessary
});

Pamiętaj, aby użyć

Query#populate
http://mongoosejs.com/docs/api ... ulate
jeśli chcesz załadować swojego użytkownika takim artykułem:
Article.findOne({_id: <some_id>}).populate("owner").exec(function(error, article) {
console.log(article.owner);// Shows the user result
});
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

User.findOne({ 'name' : 'ABC' }) .exec(function (err, user){
article.owner = user.fieldName;
})
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Odpowiedź Hexacyanide pokazuje, jak przesyłać dane z asynchronicznego dB, aby znaleźć wywołanie zwrotne za pośrednictwem innej funkcji zwrotnej. Uratował mnie dla mojego projektu!
Ustaw zmienną na wynik wyszukiwania Mongoose
https://coderoad.ru/18938469/

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się