Как получить значение из документа mongoose / mongodb после использования findOne () - PullRequest
0 голосов
/ 23 апреля 2019

Я делаю приложение для опроса, где на / createpoll вы можете заполнить новый вопрос и ответить на него. На странице индекса вы можете проголосовать в опросе. Прямые обновления выполняются с использованием Primus (websocket).

Файл live.js, который я использую, работает в качестве концентратора для передачи данных и запуска событий (например, голосование в опросе, чтобы все могли видеть обновления в режиме реального времени).

Когда я подключаюсь к странице индекса, я хотел бы показать последний опрос из онлайн-коллекции базы данных mongodb. Я написал запрос и вернул документ. Однако переменная, в которой я сохраняю запрос, возвращает неопределенное значение, когда console.logged или передается на страницу индекса, где я хочу поместить его в html.

Основной вопрос: как сохранить значение без ключа в переменной?


Я пытался разобрать, разобрать, ... но все возвращаются с ошибками.


// the connection works, uri details are at the top of the file, but I 
// won't include for safety. I can see the data getting stored.

mongoose.connect(uri, { useNewUrlParser: true})

  .then((conn)=>{
  let modelConn = conn.model ('poll', pollSchema);

  let question = modelConn.findOne({},'question', {projection:{question:1, _id: 0}},function(err,obj) { console.log(obj); }).sort([['_id', -1]]);

  let answer1 = modelConn.findOne({},'answer1', {projection:{answer1:1, _id: 0}}, function(err,obj) { console.log(obj); }).sort([['_id', -1]]);

  let answer2 = modelConn.findOne({},'answer2', {projection:{answer2:1, _id: 0}}, function(err,obj) { console.log(obj); }).sort([['_id', -1]]);

  primus.write({
    "action": "showDbPoll",
    "question": question,
    "answer1": answer1,
    "answer2": answer2
  });


})
  .catch((errorMessage) => {
  console.log(errorMessage);
});
// console output from nodemon

{ question: 'a question' }
{ answer1: 'answer 1' }
{ answer2: 'answer 2' }


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

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Нет необходимости делать 3 запроса к базе данных, а также можно избежать проецирования и сортировки.Попробуйте этот код:

mongoose.connect(uri, { useNewUrlParser: true})

  .then(async (conn) => {
  const modelConn = conn.model('poll', pollSchema);

  const { question, answer1, answer2 } = await modelConn.findOne({});

  primus.write({
    "action": "showDbPoll",
    "question": question,
    "answer1": answer1,
    "answer2": answer2
  });
})
  .catch((errorMessage) => {
  console.log(errorMessage);
});
0 голосов
/ 23 апреля 2019

Возврат из обратного вызова не будет работать.Вы можете использовать async..await как:

async function someFunc(uri) {
  try {
    const conn = await mongoose.connect(uri, { useNewUrlParser: true});
    const modelConn = conn.model ('poll', pollSchema);
    // not sure why you're using sort so skipped it
    // maybe something like this ? https://stackoverflow.com/questions/13443069/mongoose-request-order-by
    // .findOne({}, 'question', {sort: { _id: -1 }, projection:{ question:1, _id: 0 } });
    const question = await modelConn.findOne({},'question', {projection:{question:1, _id: 0}});
    const answer1 = await modelConn.findOne({},'answer1', {projection:{answer1:1, _id: 0}});
    const answer2 = await modelConn.findOne({},'answer2', {projection:{answer2:1, _id: 0}});

    primus.write({
      "action": "showDbPoll",
      "question": question,
      "answer1": answer1,
      "answer2": answer2
    });
  } catch (e) {
    // handle error
    console.error(e)
  }
}
someFunc(uri)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...