Как сохранить результаты запроса мангуста в переменной, чтобы ее значение можно было использовать * позже * в коде? - PullRequest
0 голосов
/ 30 июня 2018

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

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

Вот что я пытаюсь сделать:

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

Пока (и для простоты) у меня есть следующая схема:

const SectionSchema = new Schema({
    name: String,
    description: String
})

const Section = mongoose.model('Sections',SectionSchema)

Я бы хотел получить эти данные для использования в одном из моих макетов (заголовок навигации), поэтому я попробовал что-то вроде этого:

const express = require('express')
const app = express()

Section.find().then(function(docs){
    app.locals.sections = docs
})

console.log(app.locals.sections) // undefined

Это, очевидно, не совсем работает из-за того, что find() является асинхронным, или, скорее, он работает, но значения заполняются в другое время. Я знаю, что если я выполню проверку console.log внутри функции, то получу результат, но это не проблема, я хочу сохранить данные в app.locals, чтобы впоследствии я мог использовать их в одном из своих макетов.

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

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

Заранее спасибо.

РЕДАКТИРОВАТЬ: я должен был упомянуть, что я использую экспресс.

1 Ответ

0 голосов
/ 30 июня 2018

Приложение вашего узла, скорее всего, будет состоять из обработчиков маршрутов для запросов http. app.locals.section будет неопределенным, если вы вызовете его вне обратного вызова, но он будет существовать в обработчике маршрута.

Допустим, вы использовали что-то вроде express или restify:

const app = restify.createServer()

app.get('/', (req, res) => {
    return res.json(app.locals.sections)
})

Section.find().then(function(docs){
    app.locals.sections = docs
})

console.log(app.locals.section) // is undefined

app.listen(8080-, ()=>{
  console.log('Server started ?  ',8080)
})

На самом деле, это может быть не определено, если вызов базы данных занял много времени или пользователь сразу после запуска нажал на приложение. Запуск сервера в обратном вызове обеспечит существование app.locals.section при каждом сценарии:

Section.find().then(function(docs){
    app.locals.sections = docs
    app.listen(8080-, ()=>{
      console.log('Server started ?  ',8080)
    })
})

Вы можете использовать async / await внутри функции, чтобы создать впечатление, что вы не используете обещания. Но вы не можете использовать его на верхнем уровне вашего модуля. Смотрите здесь: Как я могу использовать async / await на верхнем уровне?

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

Section.find().then((docs)=>{app.locals.sections = docs})
    .then (()=>{/*dosomething with app.locals.sections */})
    .then(startServer)


function startServer() {app.listen(8080-, ()=>{
  console.log('Server started ?  ',8080)
})}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...