javascript - 基于node.js和express中的路径运行不同数据库查询的更好方法

标签 javascript node.js express

我想获得一些关于如何使用 express.js 根据网址中的路径调用不同数据库查询的建议。这是一个有效的示例代码,但我不确定这是否是最好的方法:

server.js

var express = require('express'),
app = express(),
Promise = require("bluebird"),
db = require('./db/managedb'); // database modules for sequelize.js

app.get('/p/:section/:optional?', function(req, res){ 

  var section = req.params["section"];
  var optional = req.params["optional"];

  if(section == "index"){

   Promise.props({

       main: db.db.query('CALL sp1()'),
       second: db.db.query("CALL sp2()")

    }).then(function(obj){ 
       res.render(section+'.html',obj) 
    }).catch(function (error) {
    })

  }else if(section == "overviews"){

   var page = req.query.page || 0;

   Promise.resolve(db.db.query('CALL sp3(:page)',{page:page})).then(function(d){
      res.render(section+'.html',d)
   })

  }else if(section == "reviews"){

   var page = req.query.page || 0;
   var review_id = req.query.review_id || 1; 

   Promise.resolve(db.db.query('CALL sp4(:review_id,:page)',{review_id:review_id,page:page})).then(function(d){
        res.render(section+'.html',d)
   })
  }
})

这是一个好的解决方案吗?我担心的是,如果我不断为新的 section 添加更多条件,可能会很困惑,但是有没有更好的方法来根据路径调用不同的数据库查询?如有任何建议,我们将不胜感激。

最佳答案

我会简单地使用不同的路由处理程序,如下所示:

var express = require('express'),
    app     = express(),
    Promise = require('bluebird'),
    db      = require('./db/managedb'); // database modules for sequelize.js

app.get('/p/index/:optional?', function(req, res) {
  Promise.props({

    main: db.db.query('CALL sp1()'),
    second: db.db.query('CALL sp2()')

  }).then(function(obj) {
    res.render('index.html', obj);
  }).catch(function(error) {
  });
});

app.get('/p/overviews/:optional?', function(req, res) {

  var page = req.query.page || 0;

  Promise.resolve(db.db.query('CALL sp3(:page)', {page: page})).then(function(d) {
    res.render('overviews.html', d);
  });
});

app.get('/p/reviews/:optional?', function(req, res) {

  var page = req.query.page || 0;
  var review_id = req.query.review_id || 1;

  Promise.resolve(db.db.query('CALL sp4(:review_id,:page)', {review_id: review_id, page: page})).then(function(d) {
    res.render('reviews.html', d);
  });
});

如果路由之间有更多共享代码,则可以使用 next() 回调来使用多个路由处理程序。例如,您可以将 d 中的内容写入 req 中,然后只需调用 next() 而不是 res.render( ...)。然后,您可以在这三个路由处理程序下方添加另一个与旧路由处理程序具有相同签名(匹配所有路由)的路由处理程序,并调用 res.render(section + '.html', req.d) (或其他代码) )在那里。

关于javascript - 基于node.js和express中的路径运行不同数据库查询的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28558459/

相关文章:

javascript - 通过 JQuery UI Javascript 集成循环或通配符

node.js - Mongoose findOneAndUpdate 不接受开关案例值

javascript - AngularJs GPS 访问在其他州被拒绝

node.js - Typescript:入门问题(找不到模块 fs 并且找不到名称输入)

javascript - Iron 路由器使用 Meteor.call 进行操作时会抛出 writeHead 不是函数

mysql - 如何在 NodeJS 中使用 MySQL @Session 变量?

javascript - Nodemon 和 Redwood-Broker

node.js - 自动编译 TypeScript 源并复制静态(模板)文件

javascript - 使用 js-ctypes,如何从 Windows ReadFile 检索输出?

javascript - 是否可以刷新 Bootstrap 选项卡