我正在使用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});
};
好吧,至少对我有用。 :)
答案 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
(即使您在开始时通过服务器端呈现它),因为您需要更新在线用户列表实时。