It seems pretty straight forward to validate user's input in Node.js RESTapi with Joi
.
But the problem is that my app is not written in English. That means I need to send a custom written messages to the frontend user.
I have googled for this and only found issues.
Maybe could someone give a solution for this?
This is the code I am using to validate with the Joi
system:
var schema = Joi.object().keys({ firstName: Joi.string().min(5).max(10).required(), lastName: Joi.string().min(5).max(10).required() .. }); Joi.validate(req.body, schema, function(err, value) { if (err) { return catched(err.details); } }); function catched(reject) { res.json({ validData: false, errors: reject }); }
Plus, is there a way to use Joi
in client side?
Thanks!
Joi can be used for creating schemas (just like we use mongoose for creating NoSQL schemas) and you can use it with plain Javascript objects. It's like a plug n play library and is easy to use. On the other hand, express-validator uses validator. js to validate expressjs routes, and it's mainly built for express.
Original answer:
The current way (I personally find it better) is to use .messages()
(or .prefs({messages})
).
const Joi = require('@hapi/joi'); const joiSchema = Joi.object({ a: Joi.string() .min(2) .max(10) .required() .messages({ 'string.base': `"a" should be a type of 'text'`, 'string.empty': `"a" cannot be an empty field`, 'string.min': `"a" should have a minimum length of {#limit}`, 'any.required': `"a" is a required field` }) }); const validationResult = joiSchema.validate({ a: 2 }, { abortEarly: false }); console.log(validationResult.error); // expecting ValidationError: "a" should be a type of 'text'
Usage of .errors()
is not recommended just to update default message with custom message.
.prefs({ messages })
is an elaborate way to provide more options as preferences. The other options for prefs are taken directly from options of .validate()
Further read: https://github.com/hapijs/joi/issues/2158
Update 1: I saw that the above explanation did not work out for some folks, so I have put up some code to test yourself. Check it here: https://runkit.com/embed/fnfaq3j0z9l2
Also updated the code snippet shared previously to have details from package inclusion, to usage, to calling the actual validation method.
Update 2: The list of joi error types and their description (for .messages()
- like string.base, array.unique, date.min etc..) is available here.
Update 3: Joi has moved from hapi project to standalone: https://www.npmjs.com/package/joi. Make sure you are using latest version (or at least above v17).
Extending on Ashish Kadam's answer, if you have many different error types, you can check which type of error is present, and set its message accordingly:
v17.4.0 uses err.code
var schema = Joi.object().keys({ firstName: Joi.string().min(5).max(10).required().error(errors => { errors.forEach(err => { switch (err.code) { case "any.empty": err.message = "Value should not be empty!"; break; case "string.min": err.message = `Value should have at least ${err.local.limit} characters!`; break; case "string.max": err.message = `Value should have at most ${err.local.limit} characters!`; break; default: break; } }); return errors; }), // ... });
You can check the list of errors here: Joi 17.4.0 API Reference > Errors > List of errors
v14.3.1 uses err.type
var schema = Joi.object().keys({ firstName: Joi.string().min(5).max(10).required().error(errors => { errors.forEach(err => { switch (err.type) { case "any.empty": err.message = "Value should not be empty!"; break; case "string.min": err.message = `Value should have at least ${err.context.limit} characters!`; break; case "string.max": err.message = `Value should have at most ${err.context.limit} characters!`; break; default: break; } }); return errors; }), // ... });
You can check the list of errors here: Joi 14.3.1 API Reference > Errors > List of errors
Also you can check the any.error
reference for more information. Quoting the docs:
Overrides the default joi error with a custom error if the rule fails where:
err
can be:
- an instance of
Error
- the override error.- a
function(errors)
, taking an array of errors as argument, where it must either:
- return a
string
- substitutes the error message with this text- return a single
object
or anArray
of it, where:
type
- optional parameter providing the type of the error (eg.number.min
).message
- optional parameter iftemplate
is provided, containing the text of the error.template
- optional parameter ifmessage
is provided, containing a template string, using the same format as usual joi language errors.context
- optional parameter, to provide context to your error if you are using thetemplate
.- return an
Error
- same as when you directly provide anError
, but you can customize the error message based on the errors.options
:
self
- Boolean value indicating whether the error handler should be used for all errors or only for errors occurring on this property (true
value). This concept only makes sense forarray
orobject
schemas as other values don't have children. Defaults tofalse
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With