和尚可以直接返回json数据而不是承诺吗?

时间:2016-04-28 05:32:01

标签: node.js mongodb express promise monk

我最近学习快递,想用express + mongodb + monk + ejs创建一个小博客,下面是我写的代码:

model是一些用于处理数据的js exports函数:

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;

(在这段代码中," $"是一个util函数,包括一个扩展double对象的方法,就像jQuery.extend一样。)

view是控制器呈现的页面:

<% 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);
当我安慰它时,

是一个承诺。

1 个答案:

答案 0 :(得分:0)

好的,我自己找到解决方案。 在研究了基于Koa项目的同事代码之后,我发现我的代码与他之间有所不同:这不是僧人的错,这让我混淆了我上面提到的,它是责备快递! 下面是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
            })
        })
    })
})

看到差异?

Express是回调,回调,回调!

我的解决方案是一个名为&#34;同义词&#34;的依赖项,它说koa也是基于它,下面是我使用共同表达后的代码:

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

它看起来很棒。

谢谢你自己: - )