代码之家  ›  专栏  ›  技术社区  ›  TotoLai

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

  •  2
  • TotoLai  · 技术社区  · 9 年前

    正如我在MVC概念RoR中所知道的,我的控制器应该从模型中得到结果,然后处理它并渲染视图,类似于这样:

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

    现在我有了一个Express服务器,我尝试用MVC的方式,使用PostgreSQL(pgpromise)和jade来构建它。

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

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

    在我的模型中,我有一个all函数来处理它:

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

    但我想做的是归还电影。所有的数据库查询结果都返回给我的控制器,就像我们通常用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 回复  |  直到 9 年前
        1
  •  2
  •   Simon H    9 年前

    我会这样做,不会通过 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) }) 
     });