【问题标题】:How to return pg-promise's result back to my controller in Express?如何在 Express 中将 pg-promise 的结果返回给我的控制器?
【发布时间】:2016-04-22 19:50:50
【问题描述】:

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

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

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

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

//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 方式一样将 Movies.all 的数据库查询结果返回给我的控制器。我想事情会是这样的:

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

但是因为这会返回一个promise或由Async引起(我不确定),所以我不能让它发生,我该怎么办?

【问题讨论】:

    标签: javascript postgresql express promise pg-promise


    【解决方案1】:

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

    【讨论】:

    • 谢谢西蒙!!这可以帮助我弄清楚!有时只需要在 javascript 中以其他方式思考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2023-01-24
    相关资源
    最近更新 更多