我尝试为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
答案 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#属性而不是那样的地方。使消息成为一种功能可以使阅读代码的人更清楚。