如何将少量变量从mongodb查询传递给jade tpl

时间:2015-09-16 13:48:03

标签: node.js mongodb express pug

body, html {
height:100%;
}

.introimage {
	height: 100%;
	background-image: url(img/wald.gif);
	background-size: cover;
	background-position: bottom;
}

玉石模板

//posts
var docs, cats;
var db = req.db;
var catcollection = db.get('catcollection');
var postcollection = db.get('postcollection');
 // find all post
     postcollection.find({},{},function(e,docs){
        console.log('posts ---> '+util.inspect(docs));
      }); // end find all post
    catcollection.find({},{},function(e,catss){
        cats=catss;
      console.log('cats --> '+util.inspect(cats)); //<<<---- write objects from mongo 

     }); // end find all cats for select

res.render('newpost', {
        posts : docs, cats:cats, title: 'Add New post'});

}); **//<<<---it  didn't passing the  cats:cats and post vars to jade ** 

我在jade tpl中收到此错误消息 无法读取未定义的属性“长度”

但如果我写了

extends layout
  block content
   h1= title

   form#formAddPost(name="addpost",method="post",action="/addpost")

      input#inputPostTitle(type="text", placeholder="posttitle", name="posttitle")

         textarea#inputPostTitle(placeholder="postdesc", name="postdesc")

        textarea#inputPostTitle(placeholder="posttext", name="posttext")

       select#selectPostCats(placeholder="postdesc", name="posttext")
            each cat, i in cats
                     option(value="#{cat._id}") #{cat.titlecat}

         button#btnSubmit(type="submit") submit


  ul
     each post, i in posts
        li= i+" "
             a(href="/editpst/#{post._id}")=#{post.title}

它将类别列表传递给jade,但我无法将帖子列表传递给jade。 如何将少数变量(帖子和猫)传递给jade tpl?

1 个答案:

答案 0 :(得分:2)

两个.find都以异步方式执行,因此您不知道何时(或是否)将完成任何一个。也就是说,在尝试渲染模板之前,需要等到两个的回调都被调用。

当前实现中最简单的方法是嵌套所有内容:

postcollection.find({},{},function(e,docs){
  // handle errors
  catcollection.find({},{},function(e,cats){
    res.render('newpost', {
      posts : docs, cats:cats, title: 'Add New post'});
    });
  }); 
});

但是,您可以同时执行这些查询,因为它们不相互依赖。最好的方法是使用promises。

Promise.all([postcollection.find(), catcollection.find()])
.then(function (docs, cats) {
    res.render('newpost', {
      posts : docs, cats:cats, title: 'Add New post'});
    });
});

这假设.find返回一个承诺。它应该适用于当前的Mongo驱动程序。