не может использовать результаты запроса mon goose при вызове из другой функции - PullRequest
1 голос
/ 01 апреля 2020

Я пишу движок блога, используя express, и столкнулся с проблемой при попытке выполнить запрос mon goose через функцию:

Я пытаюсь получить переменная, которая содержит следующие и предыдущие сообщения в блоге по id, для этого я написал следующую функцию:

middleware.getAdjacentPosts = async function(_id) {
var adjacentPosts = {}
await Post.findOne({ _id: { $gt: _id } }).sort({ _id: 1 }).exec(async function(err, nextPost) {
    if (err) {
        console.log(err)
    } else {
        if (nextPost == null) {
            adjacentPosts.nextPost = false;
        } else {
            adjacentPosts.nextPostUrl = nextPost.slug;
            adjacentPosts.nextPostTitle = nextPost.title;
        }
        await Post.findOne({ _id: { $lt: _id } }).sort({ _id: -1 }).exec(
            async function(err, previousPost) {
                if (err) {
                    console.log(err.message);
                } else {
                    if (previousPost == null) {
                        adjacentPosts.previousPost = false;
                    } else {
                        adjacentPosts.previousPostUrl = previousPost.slug;
                        adjacentPosts.previousPostTitle = previousPost.title;
                    }
                    console.log(adjacentPosts)
                    return adjacentPosts
                }

            })

    }
})

}

Перед возвратом я вижу переменную, заполненную тем, что мне нужно через console.log. У меня проблема в том, что когда я пытаюсь выполнить функцию, получающая переменная пуста. Это будет выполнено в маршруте получения для сообщения, как показано ниже:

Router.get("/posts/:slug", async function(req, res) {

await Post.findOne({ slug: req.params.slug }).populate('categories').populate('comments').exec(async function(err, foundBlog) {
    if (err) {
        console.log(err.message)
    } else {
        var posts = {}
        posts = await middleware.getAdjacentPosts(foundBlog._id)
        console.log(posts)
        res.render("frontoffice/post", {
            blog: foundBlog,
            postUrl: req.params.slug,
            adj: posts,
            reCaptchaSiteKey: process.env.CAPTCHA_SITE_KEY
        })
    }
})

})

Есть какие-нибудь подсказки, что я могу делать неправильно?

1 Ответ

1 голос
/ 01 апреля 2020

Как подсказывает @LucaKiebel, вам нужно будет вернуть результаты ваших findOne s:

middleware.getAdjacentPosts = async function(_id) {
  var adjacentPosts = {};
  return await Post.findOne({ _id: { $gt: _id } })
    .sort({ _id: 1 })
    .exec(async function(err, nextPost) {
      if (err) {
        console.log(err);
      } else {
        if (nextPost == null) {
          adjacentPosts.nextPost = false;
        } else {
          adjacentPosts.nextPostUrl = nextPost.slug;
          adjacentPosts.nextPostTitle = nextPost.title;
        }
        return await Post.findOne({ _id: { $lt: _id } })
          .sort({ _id: -1 })
          .exec(async function(err, previousPost) {
            if (err) {
              console.log(err.message);
            } else {
              if (previousPost == null) {
                adjacentPosts.previousPost = false;
              } else {
                adjacentPosts.previousPostUrl = previousPost.slug;
                adjacentPosts.previousPostTitle = previousPost.title;
              }
              console.log(adjacentPosts);
              return adjacentPosts;
            }
          });
      }
    });
};

Потенциальное улучшение, поскольку вы все равно используете async / await, возможно, избавится от обратные вызовы:

middleware.getAdjacentPosts = async function(_id) {
  var adjacentPosts = {};
  try {
    const nextPost = await Post.findOne({ _id: { $gt: _id } }).sort({ _id: 1 });
    if (nextPost == null) {
      adjacentPosts.nextPost = false;
    } else {
      adjacentPosts.nextPostUrl = nextPost.slug;
      adjacentPosts.nextPostTitle = nextPost.title;
    }
    const previousPost =  await Post.findOne({ _id: { $lt: _id } }).sort({ _id: -1 })
    if (previousPost == null) {
      adjacentPosts.previousPost = false;
    } else {
      adjacentPosts.previousPostUrl = previousPost.slug;
      adjacentPosts.previousPostTitle = previousPost.title;
    }
    console.log(adjacentPosts);
    return adjacentPosts;
  } catch (err) {
    console.log(err);
  }
};
``
...