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

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

我的集合就像( mongodbterminal ):

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 

我的问题:

  • 所有属性返回undefined在玉(已解决)
  • “capitao”只有1条logging,但在Jade中生成31条logging(已解决)
  • 如何获得index.js中的MULTIPLE集合并将它们发送给Jade?

我刚刚重写了你发布的解决scheme(很高兴它的作品:),因为你重复自己很多(10倍相同的function!)

所以这里是DRY版本(不要重复自己)。 免责声明:这是未经testing的代码!

 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] }); }) }); 

它看起来像你必须多次调用你的数据库,并等待所有的结果,然后将所有这些结果一起传递到您的模板。 以下是如何使用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] }); }) });