我想获得一些关于如何使用 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/