NodeJS - 在呈现之前将数据库查询的结果发送到视图或路由

时间:2017-09-21 01:14:53

标签: node.js postgresql express socket.io handlebars.js

我正在使用Express JS,Socket IO和Handlebars在NodeJS上制作一个webapp,但我对这些技术还很陌生。

我很难找到一种方法将查询结果传递给我的菜单(部分),主要是因为Node是异步的,所以当我的查询返回结果时,页面已经呈现,价值观从未过去。

main.handlebars(主要布局):

(...)
{{> menu}}
(...)
{{{body}}}

router.js

var express = require('express');
var router = express.Router();
var index_controller = require('../controllers/index_Controller');

router.get('/', index_controller.index);
module.exports = router;

index_controller.js

exports.index = function(req, res) {    
     res.render('main_page_html');
};

此菜单将显示在每个页面中,我希望在此菜单中显示来自在线人员的姓名,这是查询的结果。

我尝试将查询的代码放在路由功能中,并且它可以工作,但我必须将相同的代码复制到我拥有的每个路由,因为正如我所说,这个菜单出现在所有路径中。 / p>

如果我尝试在路由功能之外执行某项功能,则异步启动并且不会向页面发送任何数据。

这绝对是一个更好的解决方案。

P.s。:通过套接字将数据发送到客户端是一种方式,但我想在服务器端做事。

- 溶液 -

我按照Tolsee的说法做了,我创建了一个中间件,所以现在我可以在每个需要的路由中调用这个中间件。这就是我的表现:

menu.js

exports.onlineUsers = function (req, res, next) {
// database query {
//     res.locals.onlineUsers = queryResult;
//     next();
// }
}

router.js

var menu_midd = require('../middleware/menu');

router.get('/', menu_midd.onlineUsers, index_controller.index);
module.exports = router;

index_controller.js

exports.index = function(req, res) {    
     res.render('main_page_html',  {data: res.locals.onlineUsers});
};

好吧,至少对我有用。 :)

1 个答案:

答案 0 :(得分:1)

这个问题有两个解决方案。如果您想在服务器端执行,则需要将菜单数据传递给handlebar/view。如果您希望它通过所有页面,那么您可以创建middleware功能并将其用于所有路由器,如下所示:

function middleware(req, res, next) {
    // your code
    // define your menu variable
    // And assign it to res.locals
    res.locals.menu = menu
    next()
}

// let's employ it to all the routes 
app.use(middleware)

// You can employ it to separate routes as well
myRouter.get('/sth', middleware, function(req, res) {
    // your code
})

话虽如此,如果您的菜单显示在线用户,您将需要使用socket.io(即使您在开始时通过服务器端呈现它),因为您需要更新在线用户列表实时。