关于node.js:express.js中的“ app.render”和“ res.render”有什么区别?

What's the difference between “app.render” and “res.render” in express.js?

app.render的文档:

Render a view with a callback responding with the rendered string. This is the app-level variant of res.render(), and otherwise behaves the same way.

res.render的文档:

Render a view with a callback responding with the rendered string. When an error occurs next(err) is invoked internally. When a callback is provided both the possible error and rendered string are passed, and no automated response is performed.

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


以下是一些区别:

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

  • app.render始终在回调函数中返回html,而res.render仅在将回调函数指定为第三个参数时才返回。如果在没有第三个参数/回调函数的情况下调用res.render,则呈现的html将以状态码200发送给客户端。

    看下面的例子。

    • app.render

      1
      2
      3
      4
      5
      6
      7
      8
      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>res vs app render<link rel="stylesheet" href="/stylesheets/style.css"></head><body>res vs app render<p>
      Welcome to res vs app render
      </p></body></html>
    • res.render,不带第三个参数

      1
      2
      3
      4
      5
      6
      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具有第三个参数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      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
  • res.render在内部使用app.render呈现模板文件。

  • 您可以使用render函数创建html电子邮件。根据您应用程序的结构,您可能并不总是具有app对象的权限。

    例如在外部路线中:

    app.js

    1
    2
    3
    4
    5
    6
    7
    var routes = require('routes');

    app.get('/mail', function(req, res) {
        // app object is available -> app.render
    })

    app.get('/sendmail', routes.sendmail);

    routes.js

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

  • 在需要渲染视图但不通过http将其发送给客户端的情况下,请使用app.render。 html电子邮件浮现在脑海。


    与这两个变体一起,还有jade.renderFile生成不需要传递给客户端的html。

    用法-

    1
    2
    3
    4
    5
    6
    7
    8
    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中的路由。