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


82

的文件app.render

使用回调响应渲染的字符串来渲染视图。这是的应用程序级变体res.render(),否则行为相同。

的文件res.render

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

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

Answers:


146

以下是一些区别:

  1. 您只能app.renderroot级别上调用,而res.render只能在route / middleware内部调用。

  2. app.render始终html 在callback函数中返回,而res.render仅在您将callback函数指定为第三个参数时才返回。如果您在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.renderapp.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缓存机制如何?是否app.render使用它呢?
fider 2014年

如何在客户端获取标题键值?我正在使用HTML文件(ejs)
Mangesh Sathe 2015年

23

用于app.render需要渲染视图但不通过http将其发送给客户端的场景。html电子邮件浮现在脑海。


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中的路由使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.