关于monk+mongodb+express+ejs数据操作的疑问
发布于 9 年前 作者 Xheldon 3505 次浏览 最后一次编辑是 8 年前 来自 问答

遇到一个res.render()的问题,项目相关信息如下: 项目采用MVC模式 controller是路由和相关逻辑控制,如访问一个content页面(已经省略require引用): controller/content.js:

	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
        }));
        next();
    });
	});
	module.exports = router;

其对应的view是: view/content.js:

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

相应model是:

	var db = require('../model/public');
	var contentCollection = db.db.get('contentcollection');
	exports.getContent =  function (fn) {
    contentCollection.find({},{},function(err,data){
        fn(data);
    });
};```
我的问题是,如果view中的数据来不同的model,该如何在controller中输出呢?
现在想访问model中的getContent方法查询的数据,必须在这个方法的回调中使用,如上述的controller的render中:
```javascript 
	router.get('/', function(req, res, next) {
	$data.getContent(function(data){
        res.render('content', $.extend(req.staticRes,{
            article: data
        }));
    });
});	

因为render之后req-res响应体就关闭了,无法再发送数据给页面,那我该如何通过一个view访问不同的model读出的数据呢? 我的想法是这样的,上述中可以改为这样: controller/content.js:

	res.render('content', $.extend(req.staticRes,{
        article: $data.getContent()
    }));

当然相应的model也需要改变,问题的关键是,现在model中的getContent中的monk查询数据库,返回的是一个Promise对象: model/content.js

 exports.getContent =  function (fn) {
    contentCollection.find({},{},function(err,data){
        fn(data);
    });
};

想操作这个data只能在contentCollection里面的回调操作,无法直接返回查询出来的数据给getContent,因为这个: contentCollection.find({},{},function(err,data){ fn(data);}); 是一个promise。 第一次发帖,求轻喷。 any idea?

回到顶部