【问题标题】:How to render view template using node js express如何使用 node js express 渲染视图模板
【发布时间】:2017-10-27 07:33:13
【问题描述】:

我创建了一个 Ajax 请求(如下),它将数据与我需要的信息一起传递到服务器。

function verify(key) {

    $.ajax({
      async: true,
      type: 'GET',
      url: '/zonepass/'+key,
      data: { 
        'zone_key': key
      },
      success: function(res){
          //alert('Sent a text message successfully to ' + res);
      }

    });
}

我在服务器端处理 Ajax 请求,在服务器端我使用传入的数据来查询我的 Firebase 数据库以获取其他相关信息。

然后我尝试使用 res.render('verify',{zone: obj, key: zone_key}) 呈现我想要导航到的视图页面,其中 verify 是我想要将用户导航到的另一个 .ejs 文件,JSON 对象是我想要传递到的数据那个模板。

我的代码没有呈现视图页面,我不知道为什么。我控制台记录了服务器上的所有数据,并且所有数据都被正确提取,但是我的视图页面永远不会导航到验证 ejs 文件...

app.get('/zonepass/:id', function(req,res) {
  var zone_key = req.param('zone_key');
  var zone_obj = firebase.database().ref('zones').child(zone_key).once('value').then((snap) => {
    obj = snap.val();
    res.render('verify',{zone: obj, key: zone_key});
  });
});

【问题讨论】:

    标签: javascript node.js ajax express firebase-realtime-database


    【解决方案1】:

    res.render 不适用于 ajax 请求,来自 ajax 调用的响应返回并可在 success 函数内访问,但 res.render 也不起作用 res.redirect 不适用于 ajax 请求.

    因此,您需要使用表单提交请求或在前端重定向到该路由,这在技术上也是 get 请求,但没有 ajax 示例:

    仅使用 HTML:

    <a href="/zonepass/<your id>?zone_key=<your zone key>">Verify</a>
    


    使用 JavaScript:

    function verify(key) {
        window.location.href= "/zonepass/"+ <your id> + "?zone_key=<your zone key>"
    }
    

    此外,在您的 NodeJS 路由中,您可以使用 req.params.id 访问 id,使用 zone_key 访问 zone_key,因此您的服务器代码将是:

    app.get('/zonepass/:id', function(req,res) {
    
        var id = req.params.id;          
        var zone_key = req.query.zone_key;
        var zone_obj = firebase.database().ref('zones').child(zone_key).once('value').then((snap) => {
               obj = snap.val();
               res.render('verify',{zone: obj, key: zone_key});
        });
    });
    

    顺便说一句,您需要在验证视图中处理,如果密钥未验证,例如您在验证视图中显示错误或消息,密钥不正确......或与您的逻辑相关的任何消息

    【讨论】:

    • 我无法使用上述方式进行重定向,因为我还需要将区域对象和密钥对象传递给模板
    • 我的 get 请求也试图拉取这个:GET /zonepass/-KxRo2jOvG8lX9VhIWoq?zone_key=-KxRo2jOvG8lX9VhIWoq 500 15.504 ms - 865。如何防止我的请求添加额外的数据 (?zone_key= ...)这是我传递给我的服务器的对象,但它被添加到 GET url 请求中
    • 是的,这会将它们传递给模板,上面所做的与您的请求相同,它将在您的路线内结束,它与 get 请求相同,但不使用 ajax .. . 我编辑了代码以将zone_key 也视为查询参数,所以现在您仍然发送idzone_key
    • 1.如果我以 javascript 方式进行操作,如何从 url 中提取 id?在服务器端,我需要提取 url 以将其发送到模板 2。出于生产/安全目的,我最终必须屏蔽我的 url,所以这种方法仍然有效,因为我很难提取来自服务器端 url 的 id..?
    • 关键是javascript方式或html方式都被视为get请求,所以当您执行document.href.location = "/zonepass/"+ &lt;your id&gt; + "?zone_key=&lt;your zone key&gt;"时,服务器路由将具有与您使用ajax相同的请求.. .我还在答案中提到你如何使用req.params.idreq.query.zone_key从请求中提取idzone_key ...最重要的一点是要了解上述方式是一个正常的get请求对于服务器,它与您的 ajax 请求相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多