在NodeJS / ExpressJS中的res.locals上应用Getter属性返回数组

时间:2015-05-24 10:36:35

标签: javascript node.js express pug

我尝试为expressjs开发一个简单的flash函数(请不要链接到现有的库,我知道它们)。

一个问题令人头疼。如果我将req.session.flash分配给res.locals.messages我想让它将数组设置为[]如果你读它。背景:如果jade模板遍历它,迭代后它将为空,否则你会再次看到旧消息。

到目前为止

代码:



app.use(function(req, res, next) {
  assert(req.session, 'req.session is required!')

  if (!util.isArray(req.session.flash)) {
    req.session.flash = []
  }

  console.log(req.session.flash)

  res.locals.messages = function() {
    var flash = req.session.flash
    req.session.flash = []
    return flash
  }

  res.flash = function(type, msg) {
    console.log('res.flash')
    req.session.flash.push({
      type: type,
      msg: msg
    })
  }
  next()
})




它的功能,但问题是我必须在玉石中执行一个功能



for flash in messages()
  .alert.alert-danger
    strong= flash.msg




但我希望它更像:



for flash in messages
  .alert.alert-danger
    strong= flash.msg




没有()

任何想法如何让它如此工作?

编辑:

一种方法接近解决方案,但尚未完成。



if (!res.locals.messages) {
  Object.defineProperty(res.locals, 'messages', {
    get: function() {
      var flash = req.session.flash
      req.session.flash = []
      console.log('flash in getter', flash)
      return flash
    }
  })
}




问题是,我收到了错误

Cannot read property 'length' of undefined

1 个答案:

答案 0 :(得分:0)

我想你可能只需要一个未定义的检查:

Object.defineProperty(res.locals, 'messages', {
    get: function() {
        var flash = req.session.flash || [];
        req.session.flash = []
        console.log('flash in getter', flash)
        return flash
    }
})

但说实话,我更喜欢messages()方法。 Javascript不是人们通常希望对象属性表现得就好像它们是具有getter / setter的C#属性而不是那样的地方。使消息成为一种功能可以使阅读代码的人更清楚。