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

app.render文档:

用渲染的string回应callback视图。 这是res.render()的应用程序级变体,否则performance方式相同。

res.render文件:

用渲染的string回应callback视图。 当下一个错误next(err)被内部调用时。 当提供callback时,可能的错误和呈现的string都被传递,并且不执行自动响应。

有人能帮我弄清楚何时使用哪一个?

这里有一些区别:

  1. 你可以在根级调用app.render在路由/中间件内调用app.render

  2. app.render总是返回callback函数中html ,而res.render只有当你指定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.render app.render内部使用app.render来渲染模板文件。

  4. 您可以使用renderfunction来创buildHTML电子邮件 。 根据您的应用程序的结构,您可能并不总是访问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 } 

在需要呈现视图但不通过http发送给客户端的场景中使用app.render 。 HTML电子邮件涌入脑海。

随着这两个变种,也有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中可用作路由。