扩展express.js响应模块

时间:2014-03-31 01:47:53

标签: javascript node.js express

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

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解决了这个问题,但是如果可能的话我宁愿在没有它的情况下解决它(或者至少知道如何:)

1 个答案:

答案 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,可能会从选项参数中拉出本地,但是在至少这是有效的