【问题标题】:NodeJS - Send result of a database query to a view or route before renderNodeJS - 在渲染之前将数据库查询的结果发送到视图或路由
【发布时间】: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


    【解决方案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(即使您在开始时通过服务器端渲染它)因为您需要更新在线用户列表-时间。

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2021-12-17
      相关资源
      最近更新 更多