繁体   English   中英

NodeJS从MongoDB中检索多个数据并显示在Jade(Pug)上

[英]NodeJS retrieve multiple data from MongoDB and display on Jade(Pug)

我有一些MongoDB集合,需要在我的网站上显示它们,使其成为一个动态页面(是团队成员,如果删除或添加1个,则应该在页面上刷新)

我的收藏就像( mongodb terminal ):

db.capitao.find() = { "_id" : ObjectId("59a6b67519404d41f9988524"), "nome" : "Renato", "email" : "example@gmail.c
om", "imagem" : "renato.png", "curso" : "Engenharia Mecânica", "lider" : 1 }

db.chassi.find() = { 
{ "_id" : ObjectId("59a6b69f19404d41f9988529"), "nome" : "Carlos", "email" : "example@ufrgs.br
", "imagem" : "possebon.png", "curso" : "Engenharia Mecânica", "lider" : 1 }
{ "_id" : ObjectId("59a6b69f19404d41f998852a"), "nome" : "Felipe", "email" : "example@gmai
l.com", "imagem" : "brunetto.png", "curso" : "Engenharia Mecânica", "lider" : 0 }
{ "_id" : ObjectId("59a6b69f19404d41f998852b"), "nome" : "Isabelle", "email" : "example@
gmail.com", "imagem" : "isabelle.png", "curso" : "Engenharia Mecânica", "lider" : 0 }
{ "_id" : ObjectId("59a6b69f19404d41f998852c"), "nome" : "Mateus Dandolini Pescador", "email" : "example@ufrgs.b
r", "imagem" : "pescador.png", "curso" : "Engenharia Mecânica", "lider" : 0 }
{ "_id" : ObjectId("59a6b69f19404d41f998852d"), "nome" : "Marcelino Colla Junior", "email" : "junior_colla@hotmail.com",
 "imagem" : "marcelino.png", "curso" : "Engenharia Mecânica", "lider" : 0 }

我的index.js(仅尝试首先从“ capitao”中检索):

router.get('/', function(req, res,next) {
   var resultArray = {
                      capitao : [],
                      chassi : []
                     };

    var db = req.db;

    //var collectionCapitao = db.collection('capitao').find();

    var collectionCapitao = db.get('capitao');

    //var chassi = db.collection('chassi').find();

    collectionCapitao.find({},{},function(e,docs){
        res.render('index', {
            env: env,
            capitao: collectionCapitao
        });
    });
});

和我的index.jade:

            .row
                each membro, i in capitao
                    .col-sm-4
                        .team-member
                            img.mx-auto.rounded-circle(src='/img/team/#{membro.imagem}', alt='#{membro.nome}')
                            h4 membro.nome
                            p.text-muted membro.curso
                            ul.list-inline.social-buttons
                                li.list-inline-item
                                    a(href="mailto:#{membro.email}")
                                        i.fa.fa-envelope

我的问题:

  • 所有属性都在jade中返回undefined(SOLVED)
  • “ capitao”只有1条记录,但它在Jade中生成了31条记录(已解决)
  • 如何在index.js中获取MULTIPLE集合并将其发送给Jade?

看来您必须多次调用数据库并等待所有结果,然后将所有这些结果一起传递给模板。 这是使用AsyncJS的方法:

const async = require("async")

async.series([
    done => collectionCapitao.find({}, done),
    done => collectionChassi.find({}, done)
], (err, results) => {
    // "results" is now an array containing [ docs1, docs2 ]
    res.render('index', {
        env: env,
        capitao: results[0],
        chassi : results[1]
    });
})

由于此代码非常简洁,因此这里有一个更详细的版本,因此您可以更好地了解发生了什么:

const getCapitao = done => {
     collectionCapitao.find({}, (err,docs) => {
          done(err, docs)
     })
}

const getChassi = done => {
     collectionChassi.find({}, (err,docs) => {
          done(err, docs)
     })
}

async.series([
    done => getCapitao(done),
    done => getChassi(done)
], ...... // get both results here

这是现在的代码,解决了

router.get('/', function(req, res,next) {

    var db = req.db;


    var collectionCapitao = db.get('capitao');
    var collectionAerodinamica = db.get('aerodinamica');
    var collectionChassi = db.get('chassi');
    var collectionControles = db.get('controles');
    var collectionDrivetrain = db.get('drivetrain');
    var collectionEletronica = db.get('eletronica');
    var collectionGestao = db.get('gestao');
    var collectionMarketing = db.get('marketing');
    var collectionPowertrain = db.get('powertrain');
    var collectionSuspensao = db.get('suspensao');


    const async = require("async")

    const getCapitao = done => {
         collectionCapitao.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getAerodinamica = done => {
         collectionAerodinamica.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getChassi = done => {
         collectionChassi.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getControles = done => {
         collectionControles.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getDrivetrain = done => {
         collectionDrivetrain.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getEletronica = done => {
         collectionEletronica.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getGestao = done => {
         collectionGestao.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getMarketing = done => {
         collectionMarketing.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getPowertrain = done => {
         collectionPowertrain.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    const getSuspensao = done => {
         collectionSuspensao.find({}, (err,docs) => {
              done(err, docs)
         })
    }

    async.series([
        done => getCapitao(done),
        done => getAerodinamica(done),
        done => getChassi(done),
        done => getControles(done),
        done => getDrivetrain(done),
        done => getEletronica(done),
        done => getGestao(done),
        done => getMarketing(done),
        done => getPowertrain(done),
        done => getSuspensao(done),
    ], (err, results) => {
        // "results" is now an array containing [ docs1, docs2, .. ]
        res.render('index', {
            env: env,
            capitao: results[0],
            aerodinamica : results[1],
            chassi : results[2],
            controles : results[3],
            drivetrain : results[4], 
            eletronica : results[5],
            gestao : results[6],
            marketing : results[7], 
            powertrain : results[8],
            suspensao : results[9]
        });
    })
});

我刚刚重写了您发布的解决方案(高兴的是,它很有效:),因为您重复了很多(相同功能的10倍!)。

这是DRY版本(请勿重复自己)。 免责声明:这是未经测试的代码!

router.get('/', function (req, res, next) {

    const db = req.db;
    const async = require("async")

    const names = ['capitao','aerodinamica','chassi','controles','drivetrain','eletronica','gestao','marketing','powertrain','suspensao']

    const collections = names.map(name => db.get(name) )

    const functions = collections.map(collection => {
        return done => collection.find( {}, done )
    })

    async.series( functions, (err, results) => {
        // "results" is now an array containing [ docs1, docs2, .. ]
        res.render('index', {
            env: env,
            capitao: results[0],
            aerodinamica: results[1],
            chassi: results[2],
            controles: results[3],
            drivetrain: results[4],
            eletronica: results[5],
            gestao: results[6],
            marketing: results[7],
            powertrain: results[8],
            suspensao: results[9]
        });
    })
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM