【问题标题】:Apply Getter property returning array at res.locals in NodeJS/ExpressJS在 NodeJS/ExpressJS 的 res.locals 中应用 Getter 属性返回数组
【发布时间】:2015-05-24 10:36:35
【问题描述】:

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

一个问题就让人头疼。如果我将 req.session.flash 分配给 res.locals.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()
})

它可以工作,但问题是我必须像翡翠一样执行一个函数

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

【问题讨论】:

    标签: javascript node.js express pug


    【解决方案1】:

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

    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# 属性一样的地方。将消息作为函数使阅读您的代码的人更清楚这一点。

    【讨论】:

      猜你喜欢
      • 2018-11-19
      • 1970-01-01
      • 2021-09-25
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多