NodeJS – 在渲染之前将数据库查询的结果发送到视图或路由

我正在使用Express JS,Socket IO和Handlebars与NodeJS做一个web应用程序,但我对这些技术很新颖。

我努力find一种方法来将查询结果传递给我的菜单(部分),主要是因为节点是asynchronous的,所以当我的查询返回结果时,页面已经呈现,通过。

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'); }; 

这个菜单会出现在每个页面上,我想在这个菜单中显示来自在线人员的名字,这是查询的结果。

我试图把路由function中的查询代码,它的工作原理,但我将不得不复制相同的代码到我有每一个路由,因为如我所说,这个菜单出现在所有的。

如果我尝试在路由function之外执行某个function,则asynchronous会启动,并且没有数据发送到该页面。

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

ps:通过套接字发送我的数据到客户端是一种方式,但我想做的事情是服务器端。

-解-

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

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}); }; 

那么,至less为我工作。 🙂

有两个解决这个问题的方法。 如果你想做服务器端,那么你需要将菜单数据传递给handlebar/view 。 如果你想通过所有的页面,那么你可以做一个middlewarefunction,并将其应用到所有的路由器,如下所示:

 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 (即使你在开始时通过服务器端渲染),因为你需要实时更新在线用户列表。