Как получить несколько коллекций, используя Mongoose - PullRequest
0 голосов
/ 16 ноября 2018

Итак, я пытаюсь получить несколько документов с помощью Mongoose и визуализировать их с помощью механизма просмотра HBS.К сожалению, единственный способ, которым я знаю, как визуализировать представление, это вызвать res.render() внутри функции обратного вызова для find() функции, используемой для получения документов из базы данных MongoDB.Таким образом, я могу получить только один документ за раз, и я хотел бы знать, как сохранить несколько документов в переменных, а затем выполнить рендеринг с использованием res.render().Кто-нибудь знает, как это сделать?Код маршрутизатора ниже.

По сути, я извлекаю данные из нескольких коллекций и хочу узнать, как сохранить выходные данные функции find() в качестве переменных, а затем передать их в функцию res.render() для ее визуализации.Ниже приведена моя попытка сохранить результаты в виде переменных, которые возвращают только обещание.

index.js:

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
var Schema = mongoose.Schema;
var moment = require('moment');

var supportForumListSchema = new Schema({
  title: String,
  description: String,
  numPosts: Number,
  dateCreated: Date
}, {collection: 'support-forum-listing'});

var artworkForumListSchema = new Schema({
  title: String,
  description: String,
  numPosts: Number,
  dateCreated: Date
}, {collection: 'artwork-forum-listing'});

var supportForumList = mongoose.model('supportForumList', supportForumListSchema);
var artworkForumList = mongoose.model('artworkForumList', artworkForumListSchema);

tempDate = new Date(1542325638042);
currentDate = new Date(1542333003752);
console.log("current date:" + currentDate.toDateString());
tempHoursAgo = currentDate - tempDate;
tempHoursAgo = tempHoursAgo / (1000*60*60);
tempDateString = tempHoursAgo.toFixed(0);   // could use Number(string) to convert back to number
console.log(tempDateString + "hours ago");

// temp new posts array
var newPosts = [
    {postTitle: "Need help!", numViews: 1, datePosted: tempDateString},
    {postTitle: "Unknown identifier", numViews: 0, datePosted: tempDateString},
    {postTitle: "Messing up my normals", numViews: 3, datePosted: tempDateString},
    {postTitle: "Anyone able to help?", numViews: 3, datePosted: tempDateString}
];

/* GET home page. */
router.get('/', function(req, res, next) {
    artworkDoc = artworkForumList.find().then(function(doc){
        return doc;
    });
    console.log(artworkDoc);
    supportForumList.find().then(function(supportDoc){
        res.render('index', { title: 'Home - 3D Artists Forum', headerTitle: "3D Artist Forums", supportForumList: supportDoc , artworkForumList: artworkDoc, latestPosts: newPosts});
    });
});

module.exports = router;

1 Ответ

0 голосов
/ 16 ноября 2018

Помните, что запросы - это асинхронные вызовы, поэтому вам следует выполнить цепочку, чтобы получить желаемый результат, в противном случае «supportForumList.find ()» может ответить до artworkForumList.find ()

Попробуйте следующим образом

router.get('/', function(req, res, next) {
    artworkDoc = artworkForumList.find().then(function(doc){
      return doc;
    }).then( doc => {
    
      supportForumList.find().then(function(supportDoc){
      res.render('index', { title: 'Home - 3D Artists Forum', headerTitle: "3D Artist Forums", supportForumList: supportDoc , artworkForumList: doc, latestPosts: newPosts});
    });;
      

});

В этом подходе supportForumList.find () выполняется только тогда, когда artworkForumList.find () ответил, и у вас есть данные в переменной "doc", а затем эти данныепередается как параметр.

Надеюсь, что это поможет

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