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

时间:2017-05-27 09:42:34

标签: javascript mysql node.js

所以我试图为一个网站(我的第一个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..."
   }
]

1 个答案:

答案 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