# Using middleware

## Getting started

So we have our two commands, but we're repeating a lot of code. Wouldn't it be nice if we could re-use the code that parses the list of numbers? That's where middleware comes in.

### Creating the middleware

Let's create a standalone middleware function that parses the numbers for us and adds the result to context state. Create it like this:

const numberMiddleware = (context, next) => {
const { content, state } = context
const numbers = content.split(" ").map(n => Number(n))
state.numbers = numbers
return next()
}

Now, we can add this middleware to our commands:

const sumCommand = new Command()
.match(matchPrefixes("sum "))
.use(numberMiddleware)
.use(context => {
const { numbers } = context.state
const summed = numbers.reduce((a, b) => a + b)
console.log(summed)
})
const multiplyCommand = new Command()
.match(matchPrefixes("multiply "))
.use(numberMiddleware)
.use(context => {
const { numbers } = context.state
const multiplied = numbers.reduce((a, b) => a * b)
console.log(multiplied)
})

The advantage of using middleware is that we can re-use code for specific situations like this one. Let's make our middleware even better by validating that the numbers passed are actual numbers:

const numberMiddleware = (context, next) => {
const { content, state } = context
const numbers = content.split(" ").map(n => Number(n))
if (numbers.some(n => isNaN(n))) {
console.log("Please specify a list of numbers separated by space.")
return
}
state.numbers = numbers
return next()
}

If you run your code again and input `sum i am a number`

you should get the message `"Please specify a list of numbers separated by space."`