Javascript 从NodeJS查询返回值,并将结果存储在对象变量中,以便在每个页面上使用
因此,我试图为一个网站(我的第一个NodeJS项目)制作一个简单的页面处理程序,并努力了解如何每次运行一个MySQL查询,并将返回的数据存储在一个变量中,以便在整个应用程序中使用。(我应该注意我使用的是ExpressJS) 目前在我的app.js文件中,我有以下内容,它似乎在为每个页面加载执行它的工作Javascript 从NodeJS查询返回值,并将结果存储在对象变量中,以便在每个页面上使用,javascript,mysql,node.js,Javascript,Mysql,Node.js,因此,我试图为一个网站(我的第一个NodeJS项目)制作一个简单的页面处理程序,并努力了解如何每次运行一个MySQL查询,并将返回的数据存储在一个变量中,以便在整个应用程序中使用。(我应该注意我使用的是ExpressJS) 目前在我的app.js文件中,我有以下内容,它似乎在为每个页面加载执行它的工作 app.use(pageHandler); 在pageHandler模块中,我有以下代码,它基于页面的URL查询数据库 var pageHandler= app.use(function (re
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..."
}
]
对于Express应用程序,您可以使用:
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);
它还实现了正确的错误处理,如果该特定路径没有匹配的数据库文档,它将把请求传递给其他潜在的路由处理程序。对于Express应用程序,它使用而不是解析
req.url
,您可以使用:
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.url
非常感谢,这真的很有帮助-如果你不介意的话,我确实有几个问题要问?我有一些东西可以在模板中打印出来,但有可能用它来定义app.js中的路由吗?因此,我不必为所有页面硬编码每个路由-它可以根据页面url和模板字段从数据库中提取所有路由?当然,但这与您的原始代码有什么不同?听起来你想在数据库中查找路径名,然后根据数据库返回的内容呈现一个模板,在我看来,这几乎就是你的原始代码所做的(虽然你会在模板文件上调用res.send(result)
而不是res.render()
),但是从我目前的理解来看,对于你网站上的每个页面,你需要做如下的事情<代码>var home=require('./路由/索引')代码>app.use('/',home)代码>那么您将如何在应用程序文件中实现动态路由/使用?还是我把过程复杂化了?非常感谢!这正是我想要实现的,非常感谢!非常感谢,真的很有帮助-如果你不介意的话,我确实有几个问题要问?我有一些东西可以在模板中打印出来,但有可能用它来定义app.js中的路由吗?因此,我不必为所有页面硬编码每个路由-它可以根据页面url和模板字段从数据库中提取所有路由?当然,但这与您的原始代码有什么不同?听起来你想在数据库中查找路径名,然后根据数据库返回的内容呈现一个模板,在我看来,这几乎就是你的原始代码所做的(虽然你会在模板文件上调用res.send(result)
而不是res.render()
),但是从我目前的理解来看,对于你网站上的每个页面,你需要做如下的事情<代码>var home=require('./路由/索引')代码>app.use('/',home)代码>那么您将如何在应用程序文件中实现动态路由/使用?还是我把过程复杂化了?非常感谢!这正是我想要实现的,非常感谢!