【发布时间】:2017-09-22 09:58:04
【问题描述】:
我正在使用 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.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});
};
嗯,至少对我有用。 :)
【问题讨论】:
标签: node.js postgresql express socket.io handlebars.js