monk return 一个 json 的数据可以直接代替 promise 吗?

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

最近在学express,想用express+mongodb+monk+ejs做一个小博客,下面是我写的代码:

模型是一些 js 导出函数来处理数据:

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

控制器正在处理路由:

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;

(在此代码中,“$”是一个实用函数,包括一个扩展双对象的方法,就像 jQuery.extend 所做的那样。)

视图是控制器呈现的页面:

<% 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 %>

让我困惑的是模型的部分,我只能在名为

的方法中访问数据
xxx.find({},{},function(data){
    //some handle with data
})

这导致我只使用这样的 getContnet 函数:

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

但我只想像下面的表格那样处理来自数据库的数据查询,所以我可以使用一些函数来查询来自不同集合的数据:

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

我的词汇量很差,感谢 google 翻译 ;-)

有人帮忙吗?

添加:

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

当我安慰它时,它是一个承诺。

好吧,我自己找办法了。 在研究了我基于 Koa 项目的同事的代码之后,我发现我的代码与 him:it 之间的差异不是我上面提到的僧侣的错,这让我感到困惑,这是 Express 的错! 下面是Koa路由渲染页面的代码风格:

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

以下是快递的(如果我没记错的话):

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

看出不同了吗?

快递是回调,回调,回调!

我的解决方案是有一个名为"co-express"的依赖,据说koa也是基于它的,下面是我使用co-express后的代码:

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

看起来很棒。

感谢我自己:-)