【问题标题】:Express.js how to make html render on client side with response.render?Express.js如何使用response.render在客户端渲染html?
【发布时间】:2018-05-30 18:33:21
【问题描述】:

我有以下路线的基本 express js 应用程序:

router.get('/', function(req, res){
        res.render('login');
    });

它工作正常 - 在我的本地主机上登录主页后,来自 login.pug 的 html 很好地呈现在客户端。但是,当我的应用程序运行时,有时我想渲染另一个 pug 文件,而客户端已经渲染了 html:

app.get('/dashboard', function(req, res){

    res.render('dashboard', {user: req.query.login});
});

但是当 get 请求在'dashboard'path 上发送时,什么也没有发生。据我了解,这是因为 res.render 只是将 pug 文件解析为 HTML 并将其作为纯字符串发送给客户端(我可以在浏览器开发人员工具中检查它,当我检查 AJAX 响应时,我会看到完全呈现的 HTML)。

现在我的问题是:有没有办法在客户端自动从 res.render 渲染 HTML?所以在服务器端我只写res.render('template') 并在客户端页面重新渲染而不处理响应?

我知道我可以清除整个 DOM 并将接收到的字符串附加到 document.body 中,我也知道我可以发出 POST 表单请求,然后页面将自动重新呈现,但我想避免这两种解决方案(不要'不要问为什么)。

提前感谢您的帮助。

【问题讨论】:

    标签: javascript html express pug


    【解决方案1】:

    当您的 Javascript 发送 Ajax 请求时,来自该 Ajax 请求的响应只是返回给您的 Javascript。而已。浏览器不显示任何内容。如果您想对该响应执行某些操作,那么您的 Javascript 有责任对其执行某些操作(将其插入页面以显示它,等等...)。

    如果您真正想要的是您希望浏览器实际转到/dashboard URL 然后显示该页面,那么您的 Javascript 可以这样做:

    window.location = '/dashboard';
    

    这将告诉浏览器获取该 URL 的内容,它将向您的服务器发出请求,您的服务器将返回呈现的 HTML,浏览器将在页面中显示它并将 /dashboard 显示为 URL浏览器栏。这应该可以满足您的所有需求。

    所以,这完全取决于您的 Javascript。为工作选择合适的工具。使用 Ajax 调用为您的 Javascript 获取数据并在您的 Javascript 中处理结果或指示浏览器加载新页面。一个或另一个。

    但是当get请求在'dashboard'路径上发送时,什么也没有发生。据我了解,这是因为 res.render 只是将 pug 文件解析为 HTML 并将其作为纯字符串发送给客户端(我可以在浏览器开发人员工具中检查它,当我检查 AJAX 响应时,我会看到完全呈现的 HTML)。

    是的,Ajax 请求就是这样做的。他们从服务器获取内容并将数据返回给您的 Javascript(并且只返回给您的 Javascript)。

    有没有办法在客户端自动从 res.render 渲染 HTML?

    是的,在您的 Javascript 中使用 window.location = '/dashboard';

    所以在服务器端我只写 res.render('template') 并且在客户端页面被重新渲染而不处理响应?

    不是来自 ajax 调用。 Ajax 调用永远不会自动显示内容。绝不。 Ajax 调用是向脚本返回数据的编程请求。他们就是这样。但是,是的,通过 Javascript,您可以通过将 window.location 设置为新 URL 来自动显示内容。

    【讨论】:

    • 这并不能真正解决我的问题。我想实现用户会话,我需要从服务器端重定向。例如,如果会话过期,在 express 顶级中间件中我会调用 res.redirect('/login'),它会调用 res.render('login')。这一切都发生在服务器端,客户端没有意识到这一点。如果我只是操纵 DOM/窗口位置,在每次 ajax 调用服务器时,我应该检查会话是否仍然有效?这真的不能用其他方式处理吗?
    • @Furman - 当您的问题并没有真正说明您要解决的真正问题时,这有点令人痛苦。我回答了你最初问的问题。 Ajax 调用永远不会在浏览器中呈现。如果你想拼出一个完全不同的问题,那么请在一个新问题中拼出它。但是,您不能要求 Ajax 调用做一些它从未设计过的事情。服务器对 Ajax 调用的响应本身不会影响浏览器显示或 URL。为此,它需要配合 Javascript 在浏览器中处理 Ajax 响应。
    • @Furman - 仅供参考,只需几行客户端 Javascript 代码即可处理来自 Ajax 调用的 JSON 响应,并查看服务器是否指示客户端 Javascript 设置 window.location = someURLInTheResponse,如果您选择实施。
    • @Furman - 而且,不,您不检查会话身份验证客户端。这是一个服务器端功能 - 总是。您在这里暴露了大约 10% 的整体问题,因此我们无法对我们拥有的数据提供任何进一步的帮助。所问的这个问题已经得到解答。请开始一个新问题,在其中包含对您要解决的整个问题的更详细描述,然后我们或许可以帮助您弄清楚应该如何设计它。
    • 嗯,你是对的,我没有在我的问题中澄清我的真正目标是什么,这可能具有误导性。我想避免检查会话(我的意思是,如果客户端由于非活动会话而应该重定向,则检查 ajax 响应)但我现在看到这是不可能的。这仍然有点痛苦,因为我需要在每个 AJAX 请求中检查活动会话的 ajax 响应。仍然感谢您的帮助和您的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2019-08-07
    • 2012-08-25
    • 2020-11-03
    • 2018-01-05
    • 2017-11-26
    • 2017-03-04
    相关资源
    最近更新 更多