Search code examples
node.jsmongodbexpresspromisemonk

Can monk return a json of data directly instead of a promise?


I learning express recently,and want to make a tiny blog with express+mongodb+monk+ejs,below is the code I writed:

model are some js exports function to handle data:

var db = require('../model/public').db;
var contentCollection = db.get('contentcollection');
exports.getContent =  function (fn) {
    contentCollection.find({},{},function(err,data){
        fn(data);
    });
};

controller is deal with route:

var express = require('express');
var router = express.Router();
var $data = require('../model/core').$content;
var $ = require('../controller/util');
router.get('/', function(req, res, next){
    $data.getContent(function(data){
        res.render('content', $.extend(req.staticRes, {
            article: data
        }));
    });
});
module.exports = router;

(in this code,"$" is a util function include a method to extend double object just like jQuery.extend do.)

view is page that be controller render:

<% include ./public/head %>
<%include ./public/header%>
<%for(var i = 0;i<article.length;i++){%>
    <div class="article">
        <div class="title">
            <%= article[i]["title"]%>
        </div>
        <div class="content">
            <%= article[i]["content"]%>
        </div>
    </div>
<%}%>
<script src="/js/content.js"></script>
<% include ./public/footer %>

what confused me is the part of model,i only can access data in a method named

xxx.find({},{},function(data){
    //some handle with data
})

that result in that i only use the getContnet function like that:

router.get('/', function(req, res, next){
    $data.getContent(function(data){
        res.render('content', $.extend(req.staticRes, {
            article: data
        }));
    });
});

but i only want to handle the data query from database like below's form,so I can use some function that query data form different collection:

router.get('/', function(req, res, next){
    res.render('content', {
        article: $data.getContent('some arguments here to query from content collection'),
        user: $data.getUser('some arguments here to query from user collection')
        });
});

my vocabulary is poor,thanks to google translate ;-)

anyone help?

add:

var s = contentCollection.find({},{},function(err,data){
        fn(data);
    });
console.log(s);

is a Promise when i console it.


Solution

  • OK,I find the solution by myself. After research my colleague'code whom project based on Koa,I find the different between my code with him:it's not the fault of monk which make me confuse that i mentioned above,it's the blame of Express! below is Koa's code style for route to render page:

    yield this.render('index', {
        topics: $Topic.getTopicsByTab(tab, p),
        items: $Scrape.getAllTopics(tab,p)
    });
    

    and below is express's(if I'm not wrong):

    router.get('/',function(){
        $data.getUserInfo(function(user){
            $data.getContent(function(content){
                res.render('index',{
                    userinfo:user,
                    content:content
                })
            })
        })
    })
    

    see the differenent?

    Express is callback,callback,callback!

    and my solution is got a dependenies named "co-express",it's said that koa also based on it,below is the code after I use co-express:

    router.get('/', wrap(function *(req,res,next){
        res.render('content',$.extend(req.staticRes,{
            content: yield $data.getContent(),
            userinfo: yield $data.getUserInfo()
        }))
    }));
    

    it's looks great.

    thanks myself :-)