我正在编写一个应用程序,我需要两种模板语言。 目前,我正在使用类似的代码
app.get('/route1', function(req, res) {
res.render('path/to/jade/template' {title: "Express")
})
app.get('route2', function(req, res) {
var _ = require('lodash')
, fs = require('fs')
, template = fs.readFileSync('views/path/to/lodash/template')
res.send ( _.template(template, {title: "Express"}) )
})
我真的很想将其移动到另一个 res 函数中,例如
res.template('path/to/lodash/template', { data })
虽然我可以编辑快速node_module,但这几乎不是一个优雅的解决方案。有没有如何做到这一点的例子? express.js是否让您可以选择扩展它已有的内容?
<小时 />更新:
我已经研究了 express 的 app.engine
函数,并有以下代码:
app.engine('js', function(path, options, fn) {
var file = fs.readFileSync(path, 'utf-8')
, template = require('lodash').template(file)
console.log(template(options)) // this logs the file how I want
return template(options)
})
当它记录我想要的内容时,似乎没有任何东西返回给客户端。 请求只是挂起。 我已经尝试过 return 语句,例如 return function() { return template(options) }
和 return function(locals) { return template(locals) }
,但它似乎没有调用该函数,所以我相信语法适用于旧版本的表达
另外,我知道consolidate.js
解决了这个问题,但如果可能的话,我宁愿在没有它的情况下解决它(或者至少知道它有多:)
我在玩了一些之后让它工作了。 我希望对我的解决方案发表一些评论:)
工作代码如下:
app.engine('js', function(path, options, fn) {
var file = require('fs').readFileSync(path, 'utf-8')
var str = require('lodash').template(file, options)
fn(null, str)
})
我仍然需要添加更好的(一些)错误处理,可能会将渲染移动到readFile
回调中而不是readFileSync
,也许从选项参数中提取本地变量,但至少这有效