如何将pg-promise的结果返回给Express中的控制器?

时间:2016-01-17 17:20:54

标签: javascript postgresql express promise pg-promise

正如我在RoR中所了解的那样,MVC概念,我的控制器应该从模型中获取结果并在处理它并渲染视图之后,如下所示:

 def index
    @movies = Movie.all
    if params[:title] || params[:director]
      @movies = Movie.search(params)
    end
  end 

现在我有一个Express服务器,我尝试使用PostgreSQL(pg-promise)和jade以MVC方式构建它。

目前,我有一个控制器文件,其代码如下:

//Get home page 
var router = express.Router();
 router.get('/', function(req, res, next) { 
  Movies.all(res); 
 }); 

在我的模型中,我有一个全部功能来处理它:

exports.all = function(res){
  var result = db.query('select * from movies').
    then(function (data) {
    // success;
    res.render('index',{title: 'Rotten Mango', movies: data} );
  })
    .catch(function (error) {
      // error;
      console.log('error !')
    });
};

但我想做的是将Movies.all的数据库查询结果返回给我的控制器,就像我们在RoR中常做的那样或典型的MVC方式。我想像会有这样的事情:

//Get home page 
var router = express.Router();
 router.get('/', function(req, res, next) { 
    // This code will return the JSON result and render into the view page
    res.render('index', Movies.all );
 }); 

但是因为这会返回一个承诺或由Async引起(我不确定),所以我无法实现,我该怎么办?

1 个答案:

答案 0 :(得分:2)

我会这样做,而不是通过res,因为这将使测试变得困难。

exports.all = function(){
   return db.query('select * from movies')
}

在您的控制器中

 router.get('/', function(req, res, next) { 
  Movies.all()
  .then(function(data) { res.send(data); })
  .catch(function(err) { res.status(500).send(err) }) 
 });