6.0.0 • Published 3 years ago
@condiments/chow-chow v6.0.0
Simplify registration of Relish.js messages.
Lead Maintainer: Robert Hernandez
Introduction
Relish provides "better error message for Hapi.js Joi validation."
However, in large scale applications managing the individual route validate functions custom messages can become tedious. Even though a common object may be defined in the hapi server's route configuration, this only facilitates common messages.
For example, if you need to have a option which is required on one route but optional on another, it is difficult to change the custom message.
Problem Example
server.route({
method: 'POST',
path: '/relish/custom',
options: {
validate: {
payload: {
input: Joi.string().min(3).max(10)
},
/// this is a bulky statement since it is a function call then a pointer to a function.
failAction: Relish({
messages: {
input: 'input is required and must be between 3 and 10 characters in length'
}
}).failAction
},
handler: handler
}
});
Solution Example
server.route({
method: 'POST',
path: '/example',
options: {
validate: {
payload: {
input: Joi.string().min(3).max(10)
}
},
// hapi standard plugin syntax
plugins: {
chowChow: {
input: 'input is required and must be between 3 and 10 characters in length'
}
},
handler: handler
}
});
Getting Started
Installation
npm install @condiments/chow-chow
Bootsrapping in hapi server
const server = new Hapi.Server({
port: 3000,
host: 'localhost'
});
const init = async () => {
await server.register(require('@condiments/chow-chow'));
// register routes
};
init();
Example Outputs
Example chow-chow
Request
curl http://localhost:3000/example -H "Content-Type: application/json" -d "{\"input\":\"HI\"}"
Response
{
"statusCode": 400,
"error": "Bad Request",
"message": "input is required and must be between 3 and 10 characters in length",
"validation": {
"source": "payload",
"errors": [
{
"key": "input",
"path": "input",
"message": "input is required and must be between 3 and 10 characters in length",
"type": "string",
"constraint": "min"
}
]
}
}
Default Relish
Request
curl http://localhost:3000/relish/default -H "Content-Type: application/json" -d "{\"input\":\"HI\"}"
Response
{
"statusCode": 400,
"error": "Bad Request",
"message": "\"input\" length must be at least 3 characters long",
"validation": {
"source": "payload",
"errors": [
{
"key": "input",
"path": "input",
"message": "\"input\" length must be at least 3 characters long",
"type": "string",
"constraint": "min"
}
]
}
}
Custom Relish
Request
curl http://localhost:3000/relish/custom -H "Content-Type: application/json" -d "{\"input\":\"HI\"}"
Response
{
"statusCode": 400,
"error": "Bad Request",
"message": "input is required and must be between 3 and 10 characters in length",
"validation": {
"source": "payload",
"errors": [
{
"key": "input",
"path": "input",
"message": "input is required and must be between 3 and 10 characters in length",
"type": "string",
"constraint": "min"
}
]
}
}
Native hapi
Request
curl http://localhost:3000/native -H "Content-Type: application/json" -d "{\"input\":\"HI\"}"
Response
{
"statusCode": 400,
"error": "Bad Request",
"message": "Invalid request payload input"
}