howhap-middleware

4.1.3 • Public • Published

Houston, we have a problem - express middleware

A small library for displaying errors from express

npm install --save howhap

app.js

let express = require('express');
let howhap = require('howhap-middleware');
 
// An *optional* preset list of errors.
let options = {
    errors: {
        DEFAULT: {
            message: 'An unknown error occurred.',
            status: 500,
            level: 'error' // this property specified what
                            // level of logging is associated
                            // with this error.
        },
        AUTH: {
            INVALID_EMAIL: {
                message: '{{ email }} is not a valid email.',
                status: 400
            },
            MISSING_PASSWORD: {
                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.
app.use(howhap(options));
 

example route

let express = require('express');
let router = express.Router();
let validator = require('validator');
 
router.post('/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(req.body.email)) {
        res.error.add('AUTH.INVALID_EMAIL', {email: req.body.email}, 'email');
    }
    // Parameters are not required. Nor is the error key,
    // which will be 'default' if none is specified.
    if(!req.body.password) {
        res.error.add('AUTH.MISSING_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) {
        res.error.add({
            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.
        res.redirect('/dashboard');
    }
 
    // Here's an example of sending json
    //
    // if(!res.error.send(null, 'json')) {
    //  res.json(user);
    // }
});

example view

<!DOCTYPE html>
<html>
    <head>
        <title>Log in</title>
        <link rel='stylesheet' href='/styles/main.scss.css' />
    </head>
    <body>
        <h1>Log in</h1>
        <form action="/auth/login" method="post">
            <div>
                <!--
                   - 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') %>">
            </div>
            <div>
                <!-- Example of using the optional default (second argument) -->
                <%= error.display('email', 'Bad password') %>
                <input type="password" placeholder="password" name="password">
            </div>
            <button>Log in</button>
        </form>
    </body>
</html>
 

Readme

Keywords

none

Package Sidebar

Install

npm i howhap-middleware

Weekly Downloads

3

Version

4.1.3

License

ISC

Last publish

Collaborators

  • alarner