在快速.js响应模块的基础上进行扩展



我正在编写一个应用程序,我需要两种模板语言。 目前,我正在使用类似的代码

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,也许从选项参数中提取本地变量,但至少这有效

最新更新