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

Apply Getter property returning array at res.locals in NodeJS/ExpressJS

本文关键字:Getter 应用 属性 返回 数组 locals NodeJS ExpressJS res      更新时间:2023-09-26

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

一个问题就能让人头疼。如果我将request .session.flash赋值给res.local .messages,我想让数组设置为[],如果你读它。背景:如果一个翡翠模板迭代了它,迭代后它应该是空的,否则你会再次看到旧消息。

目前代码:

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()
})

它可以工作,但问题是我必须在jade中执行一个函数,比如

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

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

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#属性一样。让消息成为一个函数可以让人们更清楚地阅读你的代码。