express.js中“app.render”和“res.render”有什么区别?

时间:2013-03-14 07:50:16

标签: node.js express

app.render的文档:

  

使用呈现的字符串响应回调视图。这是res.render()的应用级变体,行为方式相同。

res.render的文档:

  

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

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

3 个答案:

答案 0 :(得分:135)

以下是一些差异:

  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
    }
    

答案 1 :(得分:23)

在需要呈现视图但不通过http将其发送到客户端的场景中使用app.render。想到html电子邮件。

答案 2 :(得分: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中可用作路由