Snugerror
Snugerror is a library that facilitates the handling of errors of a certain routine, it was created aimed at separating the code focused on business rules and error checking.
We often need to write large data validation routines to throw errors, and this ends up getting mixed up with routines aimed at for business rules, making code reading bad. This reality drove the writing of this library.
Installation:
npm install snugerror
# or
yarn add snugerror
Methods:
Basic example with next method:
Triggers the next instruction for error checking, starts at position 0 of the array.
.next(...args)
import handleError from 'snugerror'
let errors = handleError([
function(data){
// Your routine for data validation here
if (!data) throw new Error('You error: error 1')
},
function(a, b){
// Your routine for data validation here
if (a !== b) throw new Error('Values is not equals')
},
(data) => {
// Your routine for data validation here
if(!data?.name) throw new Error('Type your name')
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
let data = {
a: 1,
b: 1,
name: null
}
iterator.next(data)
console.log('hello') // this console.log will running
data.b = 3
iterator.next(data.a, data.b) // will launch error 'Values is not equals'
iterator.next(data)
res.send('Hello World') // This answer will not be delivered
});
Method repeatNext:
Repeats execution of .next() a certain number of times passed as an argument.
.repeatNext(total_repeat)(...args)
import handleError from 'snugerror'
let errors = handleError([
function(data){
// Your routine for data validation here
if (!data) throw new Error('You error: error 1')
},
function(data){
// Your routine for data validation here
if (data.a !== data.b) throw new Error('Values is not equals')
},
(data) => {
// Your routine for data validation here
if(!data?.name) throw new Error('Type yout name')
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
let data = {
a: 1,
b: 1,
name: null
}
iterator.repeatNext(3)(data) // Will iterate over function 0, 1 and 2 of the array
res.send('Hello World') // This answer will not be delivered
});
Error method:
Returns an error from a specific position, or from a specific function.
.error(<position>)(...args)
.error(<name_function>)(...args)
import handleError from 'snugerror'
let errors = handleError([
function (data){
// Your routine for data validation here
if (!data) throw new Error('You error: error 1')
},
function check_id_user (data){
// Your routine for data validation here
if(!data?.id) throw new Error('User id is not valid')
},
(a, b) => {
// Your routine for data validation here
if (a !== b) throw new Error('Values is not equals')
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
let data = {
a: 1,
b: 3,
name: null
}
iterator.error(0)(data) // will launch <Error: 'You error: error 1'>
iterator.error(2)(data.a, data.b) // will launch <Error: 'Values is not equals'>
iterator.error('check_id_user')(data) // will launch <Error: 'User id is not valid'>
res.send('Hello World') // This answer will not be delivered
});
Message method:
Passes a message to the function context.
.message(<your message error>).error
.message(<your message error>).next
.message([<your message error 1>, <your message error 2>]).repeatNext
import handleError from 'snugerror'
let errors = handleError([
function(data){
// Your routine for data validation here
if (!data) throw new Error(this.message || 'Failed operation') // will launch <Error: 'You error: error 1'>
},
function(data){
// Your routine for data validation here
if (!data) throw new Error(this.message || 'Failed operation') // will launch <Error: 'this is error 2'>
},
function(data){
// Your routine for data validation here
if (!data) throw new Error(this.message || 'Failed operation') // will launch <Error: 'this is error 3'>
},
])
...
app.get("/", (req, res) => {
const iterator = errors()
iterator.message('You error: error 1').next(undefined)
iterator.message('You error: error 1').error(0)(undefined)
iterator.message(['this is error 2', 'this is error 3']).repeatNext(2)(undefined)
res.send('Hello World') // This answer will not be delivered
});
Method errors:
Returns a list of errors issued up to the call of this function.
import handleError from 'snugerror'
let errors = handleError([
function (data){
// Your routine for data validation here
if (!data) throw new Error('You error: error 1')
},
function check_id_user (a, b){
// Your routine for data validation here
if(!data?.id) throw new Error('User id is not valid')
},
(data) => {
// Your routine for data validation here
if (a !== b) throw new Error('Values is not equals')
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
try{
iterator.next(undefined)
iterator.next(1, 3)
iterator.next({name: null})
} catch (error){}
console.log(iterator.errors) // [<uncaughtException>, <uncaughtException>, <uncaughtException>]
...
});
Method checkAll:
Cycles through all error handling functions.
import handleError from 'snugerror'
let errors = handleError([
function (data){
// Your routine for data validation here
if (!data) throw new Error('You error: error 1')
},
function check_id_user (a, b){
// Your routine for data validation here
if(!data?.id) throw new Error('User id is not valid')
},
(data) => {
// Your routine for data validation here
if (a !== b) throw new Error('Values is not equals')
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
iterator.checkAll(undefined)
...
});
Attributes:
this.params
Parameter passing: Pass parameters in constructor.
import handleError from 'snugerror'
let errors = handleError([
function(data){
console.log(this.params) // [{foo: 'bar'}, 'hello', 'world', 1]
...
},
function(a, b){
const [obj, var_1, var_2, var_3] = this.params
console.log(obj) // {foo: 'bar'}
console.log(var_1) // hello
console.log(var_2) // world
console.log(var_3) // 1
...
}
])
...
app.get("/", (req, res) => {
const iterator = errors({foo: 'bar'}, 'hello', 'world', 1)
...
});
this.message
Return message: Returns the message passed when the error was issued, see message method
this.errorName
Error handler/function name: Returns the name of the exception-throwing function, ie the name of the error/function handle if you prefer.
import handleError from 'snugerror'
let errors = handleError([
function check_payment(data){
console.log(this.errorName) // check_payment
...
},
function verify_user_id(data){
console.log(this.errorName) // verify_user_id
...
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
...
});
this.methods
Method return: Returns all methods.
import handleError from 'snugerror'
let errors = handleError([
function (data){
console.log(this.methods) // {next, repeatNext, error, errors, message}
...
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
...
});
this.throw
Throw attribute: Throw an exception.
this.throw(<error_name>, <error_message>)
or
this.throw(<error_message>)
import handleError from 'snugerror'
let errors = handleError([
function (data) {
if (!data?.name) this.throw('E001', 'Here is a error') // <E001: Here is a error> instead of <Error: Here is a error>
}
])
// ----------------------------or---------------------------
let errors = handleError([
function (data) {
if (!data?.name) this.throw('Here is a error') // <Error: Here is a error>
}
])
// ----------------------------or---------------------------
let errors = handleError({
'E001': (foo) => 'erro 1 '+foo
}, [
function (data) {
if (!data?.name) this.throw('E001', 'here') // <E001: erro 1 here>
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
...
});
Other settings:
Dictionary errors:
import handleError from 'snugerror'
let errors = handleError({
'E001': () => 'Example error 1',
'E002': (a, b) => `Values is not equals: ${a} !== ${b}`
}, [
function(data){
// Your routine for data validation here
if (!data) this.throw('E001') // will launch <E001: 'Example error 1'>
},
function(a, b){
// Your routine for data validation here
if (a !== b) this.throw('E002', a, b) // will launch <E002: 'Values is not equals: 1 !== 3'>
},
(data) => {
// Your routine for data validation here
if(!data?.name) throw new Error('Type yout name') // will launch <Error: 'Type yout name'>
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
let data = {
a: 1,
b: 1,
name: null
}
iterator.next(data)
console.log('hello') // this console.log will running
data.b = 3
iterator.next(data.a, data.b) // will launch error 'Values is not equals'
iterator.next(data)
res.send('Hello World') // This answer will not be delivered
});
Create method:
In this way it is possible to configure an error message dictionary and an exception listener.
//----------------config.ts-------------------------------
import snugerror from 'snugerror'
export const handleError = snugerror.create({
dictionary: {
'E001': () => 'Example error 1',
'E002': (a, b) => `Values is not equals: ${a} !== ${b}`
'E003': () => 'ERRO 3 here',
},
onError(error){
console.log(error.name, error.message)
}
})
//----------------any-file.ts-------------------------------
let errors = handleError([
function(data){
// Your routine for data validation here
if (!data) this.throw('E001') // will launch <E001: 'Example error 1'> Obs.: error by dictionary in config.ts
},
function(a, b){
// Your routine for data validation here
if (a !== b) this.throw('E002', a, b) // will launch <E002: 'Values is not equals: 1 !== 3'> Obs.: error by dictionary in config.ts
},
(data) => {
// Your routine for data validation here
if(!data?.name) throw new Error('Type yout name') // will launch <Error: 'Type yout name'>
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
let data = {
a: 1,
b: 1,
name: null
}
iterator.next(data)
console.log('hello') // this console.log will running
data.b = 3
iterator.next(data.a, data.b) // will launch error 'Values is not equals'
iterator.next(data)
res.send('Hello World') // This answer will not be delivered
});
Create method and local dictionary:
It is possible to rewrite certain dictionary items if I pass a local dictionary.
//----------------config.ts-------------------------------
import snugerror from 'snugerror'
export const handleError = snugerror.create({
dictionary: {
'E001': () => 'Example error 1',
'E002': (a, b) => `Values is not equals: ${a} !== ${b}`
'E003': () => 'ERRO 3 here',
},
onError(error){
console.log(error.name, error.message)
}
})
//----------------any-file.ts-------------------------------
let errors = handleError({
'E001': () => 'Example error 1, hello i am a local error',
'OTHER': (a, b) => `Hello, data are bad`,
},[
function(data){
// Your routine for data validation here
if (!data) this.throw('E001') // will launch <E001: 'Example error 1, hello i am a local error'> Obs.: error by local dictionary
},
function(a, b){
// Your routine for data validation here
if (a !== b) this.throw('E002', a, b) // will launch <E002: 'Values is not equals: 1 !== 3'> Obs.: error by dictionary in config.ts
},
(data) => {
// Your routine for data validation here
if(!data?.name) this.throw('OTHER') // will launch <OTHER: 'Hello, data are bad'>
}
])
...
app.get("/", (req, res) => {
const iterator = errors()
let data = {
a: 1,
b: 1,
name: null
}
iterator.next(data)
console.log('hello') // this console.log will running
data.b = 3
iterator.next(data.a, data.b) // will launch error 'Values is not equals'
iterator.next(data)
res.send('Hello World') // This answer will not be delivered
});