Flash messaging in Express can be confusing to the newcomer. I know because I am a newcomer. The confusion tends to arise from the distinction between the concept of flash messaging, a temporary message from the server available to templates, and the various implementations of flash messaging, which include express-flash
and other modules. This Gist provides a minimal example of 2 approaches to flash messaging, the express-flash
module and custom middleware, using 3 common templating engines.
The express-flash
module exposes getter and setter methods for a flash message of the form, { flash: { type: 'type', message: 'message' }}
and depends on the express-session
module. The method req.flash(type, message)
sets the value of a new flash message and adds it to an array of messages of the same type. The method req.flash(type)
gets the value of all flash messages matching of the same type and returns either a string value for the message if there is only 1 of that type, or an array of string values for messages matching that type. The flash messages have a lifetime of one request and are deleted afterward.
The custom middleware is lifted with modifications from Ethan Brown's excellent book, Web Development with Node & Express, and depends on the express-session
module. In it, res.locals.sessionFlash
acts as a the getter and req.session.sessionFlash
acts as the setter for messages with a lifetime of one request. As in the express-flash
module, these flashes take the form, { type: 'type', message: 'message' }
, but only do so to follow established convention. They could as easily take the form, { class: 'class', intro: 'intro', text: 'text' }
and be exposed via res.locals.myFlashMessages
and req.session.myFlashMessages
.
There are a couple of important distinctions between the 2 approaches illustrated above.
First, the custom middleware option exposes all of the properties of the flash object, not just the message. So sessionFlash.type
and sessionFlash.message
are both available to the templates above just by including the sessionFlash
value, whereas the expressFlash
message type
would have to have been explicitly specified in app.js
and passed as a separate value, ie expressFlashType
, to the template.
Second, the custom middleware does not include a mechanism for adding multiple messages of the same type to an array. As it is written, res.locals.sessionFlash
and req.session.sessionFlash
are single occupancy variables.
Of note, res.locals.flash
and req.session.flash
can be used in the custom middleware above, but I chose different targets to avoid collision with the express-flash
messages.
Both approaches offer simple mechanisms for passing temporary messages to the browser. Which one of the many options you choose depends on your needs. I hope this has been helpful.