Javascript 从NodeJS查询返回值,并将结果存储在对象变量中,以便在每个页面上使用

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

因此,我试图为一个网站(我的第一个NodeJS项目)制作一个简单的页面处理程序,并努力了解如何每次运行一个MySQL查询,并将返回的数据存储在一个变量中,以便在整个应用程序中使用。(我应该注意我使用的是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..."
   }
]

对于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)那么您将如何在应用程序文件中实现动态路由/使用?还是我把过程复杂化了?非常感谢!这正是我想要实现的,非常感谢!