82

文档app.render

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

文档res.render

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

我如何确定何时使用哪一个?

4

3 回答 3

148

以下是一些区别:

  1. 您可以app.render根级别调用,并且res.render只能在 route/middleware 内部调用。

  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
    }
    
于 2013-03-14T08:38:04.910 回答
23

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

于 2013-03-14T08:08:07.237 回答
1

除了这两个变体之外,还有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 中的路由使用。

于 2015-06-18T10:03:43.920 回答