Node.js和Express应用程序中的res.render()和ejs.render()有什么区别

我在我的Node.js和Express应用程序中使用EJS模板引擎,并且迄今为止使用了它的function和渲染,到目前为止没有任何问题。

然而,虽然我总是在服务器端程序中使用语法res.render(filename, options, callback)来呈现文件的内容,但是我想知道res.render()ejs.render()之间有什么区别。

它看起来像两个方法采用渲染文件名作为第一个参数和对象embedded到文件作为第二个参数(如{title: "title here"} )。 res.render()可以将一个callback函数作为第三个(可选)参数,我已经使用它,只要我想使用嵌套的渲染,但从EJS Github仓库的文档,它可能无法采取callback函数,至less在Github存储库的文档不接受参数(尽pipe它的参数是可选的无论如何)。

所以我想知道, res.render()ejs.render()之间有什么区别。 如果只有res.render()可以采用第三个参数,那么使用ejs.render()什么意义? 或者有任何ejs.render()可以使用res.render()不能? 一般来说,我应该在我的应用程序中使用哪个函数?

我写了app.set('view engine', 'ejs'); 在我的应用程序中使用EJS来获取您的信息。

使用res.render()

如果您已经使用Express来渲染视图,则不需要直接使用EJS。 只要确保你已经把它列为你的package.json一个依赖项,并且Express会照顾其余的!

这里有一些更多的细节:

调用ejs.render()ejs.renderFile()绕过Express视图引擎。 真的意味着你必须提供给EJS的绝对path,你必须把呈现的HTML发送给客户端。

这个:

 app.get('/', function (req, res) { res.render('index.ejs'); }); 

相当于这个:

 app.get('/', function (req, res) { res.send(ejs.renderFile(__dirname + '/views/index.ejs')); }); 

res.render()的callback参数支持需要asynchronous返回的视图引擎。 EJS使用fs.readFileSync来呈现其模板,所以ejs.render()ejs.renderFile()不需要callback – 它们只是返回呈现的HTML。

我能想到的一个场景是你可以直接使用EJS,如果你想将一个模板“编译”成一个你可以稍后调用的函数:

 var ejs = require('ejs'), read = require('fs').readFileSync; var template = ejs.compile(read('path/to/template.ejs', 'utf-8')); console.log(template()); 

这对我来说有点信息,因为我不熟悉ejs。 但是我遇到了一个我没有“res”variables的场景。 例如,我需要发送一个HTML模板的电子邮件。 所以在这个用例中,我发现我们只能用ejs.render()来使用这个模板来发邮件。 因此,ejs.render()作为res.render()很重要。