mon goose .find () scope: Как я могу вызвать найденные данные из запроса? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь вызвать основанную переменную вне массива, но вместо этого она возвращает пустой массив. Может кто-нибудь объяснить, почему console.log внутри функции работает, но не за ее пределами.

// Video Schema
let mongoose =  require("mongoose");

let Schema = mongoose.Schema;

var videoSchema = new Schema ({
  title: String,
  videoURL:  String,
  author: String,
  time: String,
  viewcount: Number,
  categories: [{
    type: Schema.Types.ObjectId,
    ref: "Category"
  }],
    description: String,
})

let Video = mongoose.model("Video", videoSchema);

module.exports = {
  videoSchema: videoSchema,
  Video: Video
}

app. js

let Video = require(__dirname + "/dbs/Video.js").Video;

 app.get("/", function(req,res) {
    
    let videos = []
    Video.find(function(err, foundVideo) {
      if (!err) {
        videos = foundVideo.slice(0)
        console.log(videos) // this return me with an object array [{obj1}, {obj2}]
      } else {
        return err
      }
    })
    console.log(videos) // This return an empty array []

}

Как я могу сохранить массив foundVideos в переменная видео, чтобы она могла вызывать глобальную переменную?

1 Ответ

1 голос
/ 12 июля 2020

Когда вы выполняете эту операцию:

Video.find(function(err, data) {
  // something
  console.log("one")
})
// nothing
console.log("two")

Функция в скобках - это обратный вызов операции find(). Это означает, что он будет отозван, когда выполнение find завершится, и он может использовать параметры err или data внутри своей области. Он выполнит console.log("one"). Такой способ «ожидания» результатов обусловлен асинхронным характером js.

Вместо этого код вне метода обратного вызова будет запущен сразу после того, как поиск будет вызван , и он не будет ждать, пока операция поиска будет завершена . Следовательно, в этом примере two будет напечатано перед one.

В вашем примере переменная videos, которую вы пытаетесь напечатать вне метода обратного вызова console.log(videos), пуста, как и напечатанная перед videos действительно есть.

Вы должны написать весь свой код обратного вызова в случае !err:

if (!err) {
  videos = foundVideo.slice(0)
  console.log(videos) // this return me with an object array [{obj1}, {obj2}]
}

Обновить

Как вы заметили, кодировщик вынужден реализовывать код в методе обратного вызова. Затем другие методы или запросы, зависящие от данных из первого запроса, как правило, усложняют структурирование кода. разделы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...