所以我试图为一个网站(我的第一个NodeJS项目)创建一个简单的页面处理程序,并努力让我了解如何让每次运行MySQL Query并将返回的数据存储在一个变量中在整个申请中使用。 (我应该注意到我使用的是ExpressJS)
目前在我的app.js文件中,我有以下内容,这似乎是在执行每个页面加载时的工作
app.use(pageHandler);
在pageHandler模块中,我有以下内容根据页面的URL查询数据库。
var pageHandler= app.use(function (req, res, next) {
console.log('Trying to find details for page: ' + url.parse(req.url).pathname);
db.query("SELECT * FROM `pages` WHERE page_url = ?", [url.parse(req.url).pathname], function(err, result) {
res.send(result);
});
});
module.exports = pageHandler;
这确实打印了页面上的成功结果,但是我想将它们存储在一个变量中,我可以在整个应用程序中使用它来获取例如页面标题等等。目前从数据库返回以下内容。
[
{
"id":1,
"page_url":"/",
"title":"Home",
"meta_title":"First Node Project",
"meta_description":"Placeholder",
"meta_keywords":"nodejs, keywords, etc",
"parent_id":0,
"position":0,
"template":"home",
"content":"Lipsum..."
}
]
答案 0 :(得分:2)
对于Express应用,您可以使用res.locals
:
var pageHandler= function (req, res, next) {
console.log('Trying to find details for page: ' + url.parse(req.url).pathname);
db.query("SELECT * FROM `pages` WHERE page_url = ?", [url.parse(req.url).pathname], function(err, result) {
res.locals.page = result;
next();
});
};
module.exports = pageHandler;
这会将名为page
的变量公开给您的模板,而其他请求处理程序则可以res.locals.page
访问它。
编辑:根据我的评论理解,您希望使用上述pageHandler
中间件来动态处理页面请求。基本上,当请求到达时,它将对路径名执行数据库查找,并使用结果来呈现模板。
这是完全可以接受的,你可以使用普通的中间件,但由于你可能只想将这些请求限制在GET
,这里有一个更具体的实现:
let pageHandler = function(req, res, next) {
console.log('Trying to find details for page:', req.path);
db.query("SELECT * FROM `pages` WHERE page_url = ?", [ req.path ], function(err, result) {
// Pass errors to Express so it can handle them.
if (err) return next(err);
// If there was no matching page, pass the request along.
if (result.length === 0) return next();
// Render the template with the page data.
res.render(YOUR_TEMPLATE, { page : result[0] });
});
});
// To use:
app.get('*', pageHandler);
它还实现了正确的错误处理,如果该特定路径没有匹配的数据库文档,它会将请求传递给其他潜在的路由处理程序。它使用req.path
而不是解析req.url
。