48 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
tags:
 | 
						|
  - node-js
 | 
						|
  - REST
 | 
						|
  - APIs
 | 
						|
---
 | 
						|
 | 
						|
# Creating a RESTful API: Validation
 | 
						|
 | 
						|
We can provide server-side validation for our projects by using a **schema
 | 
						|
validator**. This is a program that declaratively parses the JSON values
 | 
						|
received as requests from the client. This makes it easy to systematically
 | 
						|
validate the data that we receive from any HTTP requests where the client sends
 | 
						|
a body to the endpoint.
 | 
						|
 | 
						|
One of the most popular schema validators for NodeJS is
 | 
						|
[joi](joi).
 | 
						|
 | 
						|
## Demonstration
 | 
						|
 | 
						|
Let's say we have a POST request that expects a single field as the body that
 | 
						|
must be a string and greater than two characters long. First we define our
 | 
						|
schema:
 | 
						|
 | 
						|
```js
 | 
						|
const schema = Joi.object({
 | 
						|
  name: Joi.string().min(3).required(),
 | 
						|
});
 | 
						|
 | 
						|
const { error } = schema.validate(req.body);
 | 
						|
```
 | 
						|
 | 
						|
The `schema` variable is an object whose keys should match those of the intended
 | 
						|
request body. Instead of actual values we provide Joi's in-built validators,
 | 
						|
concatenated as necessary. We then store the results of the validation in a
 | 
						|
variable.
 | 
						|
 | 
						|
Next we add handling in the case of errors:
 | 
						|
 | 
						|
```js
 | 
						|
if (error) {
 | 
						|
  error.details.map((joiErr) => res.status(400).send(joiErr.message));
 | 
						|
  return;
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
We loop through the error array and return 400s as the response if they are
 | 
						|
found. If there are no errors, the Joi object will return `undefined`.
 |