【问题标题】:What's the difference between "app.render" and "res.render" in express.js?express.js 中的“app.render”和“res.render”有什么区别?
【发布时间】:2013-03-02 11:29:02
【问题描述】:

app.render 的文档:

渲染一个带有回调的视图,该回调响应渲染的字符串。这是res.render() 的应用级变体,其他方面的行为方式相同。

res.render 的文档:

渲染一个带有回调的视图,该回调响应渲染的字符串。发生错误时,会在内部调用 next(err)。当提供回调时,可能的错误和呈现的字符串都会被传递,并且不会执行自动响应。

我怎样才能确定何时使用哪一个?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    在需要渲染视图但不通过 h​​ttp 将其发送到客户端的场景中使用 app.render。 html电子邮件浮现在脑海。

    【讨论】:

      【解决方案2】:

      这里有一些区别:

      1. 您可以在根级别调用app.render,而res.render只能在路由/中间件中

      2. app.render 总是在回调函数中返回html ,而res.render 只有在您将回调函数指定为第三个参数时才会这样做。如果您在没有第三个参数/回调函数的情况下调用 res.render,则呈现的 html 会以状态代码 200 发送到客户端。

        看看下面的例子。

        • app.render

          app.render('index', {title: 'res vs app render'}, function(err, html) {
              console.log(html)
          });
          
          // logs the following string (from default index.jade)
          <!DOCTYPE html><html><head><title>res vs app render</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>res vs app render</h1><p>Welcome to res vs app render</p></body></html>
          
        • res.render 不带第三个参数

          app.get('/render', function(req, res) {
              res.render('index', {title: 'res vs app render'})
          })
          
          // also renders index.jade but sends it to the client 
          // with status 200 and content-type text/html on GET /render
          
        • res.render 带第三个参数

          app.get('/render', function(req, res) {
              res.render('index', {title: 'res vs app render'}, function(err, html) {
                  console.log(html);
                  res.send('done');
              })
          })
          
          // logs the same as app.render and sends "done" to the client instead 
          // of the content of index.jade
          
      3. res.render 在内部使用app.render 来呈现模板文件。

      4. 您可以使用render 函数创建html 电子邮件。根据您应用程序的结构,您可能并不总是可以访问 app 对象。

        例如在外部路由内部:

        app.js

        var routes = require('routes');
        
        app.get('/mail', function(req, res) {
            // app object is available -> app.render
        })
        
        app.get('/sendmail', routes.sendmail);
        

        routes.js

        exports.sendmail = function(req, res) {
            // can't use app.render -> therefore res.render
        }
        

      【讨论】:

      • @zeMicro cache 机制呢? app.render也用了吗?
      • 如何在客户端获取title Key值?我正在使用 HTML 文件 (ejs)
      【解决方案3】:

      除了这两个变体之外,还有jade.renderFile,它生成不需要传递给客户端的html。

      用法-

      var jade = require('jade');
      
      exports.getJson = getJson;
      
      function getJson(req, res) {
          var html = jade.renderFile('views/test.jade', {some:'json'});
          res.send({message: 'i sent json'});
      }
      

      getJson() 在 app.js 中可用作路由。

      【讨论】:

        猜你喜欢
        • 2016-06-13
        • 1970-01-01
        • 2013-03-14
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 2010-10-02
        相关资源
        最近更新 更多