我正在编写一个需要两种模板语言的应用程序。目前,我使用的代码如
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 })
虽然我可以编辑express node_module,但这并不是一个优雅的解决方案。有没有如何做到这一点的例子? express.js是否允许您扩展已有的内容?
我已查看了快递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 function() { return template(options) }
和return function(locals) { return template(locals) }
,但它似乎没有调用该函数,因此我认为语法适用于旧版本的快递
另外,我知道consolidate.js
解决了这个问题,但是如果可能的话我宁愿在没有它的情况下解决它(或者至少知道如何:)
答案 0 :(得分:0)
在玩了一些之后我开始工作了。我喜欢我的解决方案的一些评论:)
工作代码如下:
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
,可能会从选项参数中拉出本地,但是在至少这是有效的