No description, website, or topics provided.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Houston, we have a problem - express middleware

A small library for displaying errors from express

npm install --save howhap


let express = require('express');
let howhap = require('howhap-middleware');

// An *optional* preset list of errors.
let options = {
	errors: {
			message: 'An unknown error occurred.',
			status: 500,
			level: 'error'	// this property specified what
							// level of logging is associated
							// with this error.
		AUTH: {
				message: '{{ email }} is not a valid email.',
				status: 400
				message: 'Please enter a password.',
				status: 400
	defaultFormat: 'json',	// If no response format is supplied,
							// responses will be in this format.
	logging: {
		// options for winston loggin go here

let app = express();

// Pass in the option argument to customize the behavior 
// of the middleware. Alternatively you can pass in nothing
// and use the default behavior.

example route

let express = require('express');
let router = express.Router();
let validator = require('validator');'/login', function(req, res, next) {
	let minPasswordLength = 8;
	// You can call a preset error by using dot notation to
	// traverse the predefined object and pass in parameters
	// as the second argument. Errors are keyed by any string
	// for later use. In this case 'email'.
	if(!validator.isEmail( {
		res.error.add('AUTH.INVALID_EMAIL', {email:}, 'email');
	// Parameters are not required. Nor is the error key,
	// which will be 'default' if none is specified.
	if(!req.body.password) {
	// You can also add custom error messages on the fly.
	// Parameters can be specified in one object or passed
	// in as a second argument like in the email example.
	else if(req.body.password.length < minPasswordLength) {
			message: 'Your password must be at least {{ num }} chars long.',
			status: 400,
			params: {
				num: minPasswordLength
		}, 'password');

	// Other code goes here...

	// Send the errors and redirect back to the login page.
	// If no argument is passed to the first argument of the
	// send method then you will redirect back to the referer.
	// The send method will return false if there are no errors
	// to send. The send method takes a optional second argument
	// specifying the response format you would like ('html' or
	// 'json'). The format will be resolved in the following
	// order:
	// 1. The second argument of res.error.send
	// 2. If (1) not specified then the responseFormat query
	//    parameter
	// 3. If (2) not specified then the defaultFormat middleware
	//    option
	// 4. If (3) not specified then 'json'
	// If the resolved format is 'html' the user will be
	// redirected to the specified redirect. Otherwise json will
	// be returned.
	if(!res.error.send('/login', 'html')) {
		// There were no errors, redirect.

	// Here's an example of sending json
	// if(!res.error.send(null, 'json')) {
	// 	res.json(user);
	// }

example view

<!DOCTYPE html>
		<title>Log in</title>
		<link rel='stylesheet' href='/styles/main.scss.css' />
		<h1>Log in</h1>
		<form action="/auth/login" method="post">
				   - An `error` object is passed to all views, with a
				   - display method. The first argument is the key
				   - of the error that you'd like to display. The
				   - second (optional) argument is a default value
				   - that you'd like to display if there is no error
				   - for the specified key.
				<%= error.display('email') %>
				   - A `prev` object is also passed to all views,
				   - which stores the previous data that was posted
				   - (body, query, and params). This data is only set
				   - if there was an error. It takes two arguments
				   - (the type of data and the key) as well as an
				   - optional third argument if there was no data
				   - found for that particular key.
				<input type="email" placeholder="email" name="email" value="<%= prev.display('body', 'email') %>">
				<!-- Example of using the optional default (second argument) -->
				<%= error.display('email', 'Bad password') %>
				<input type="password" placeholder="password" name="password">
			<button>Log in</button>