Skip to content

Query middleware

The query middleware is to validate and parse the url query like /users?limit=10&skip=30.

Validate

The following example shows tho to define your query validation class

ts
export class UserQuery {
	@IsNumberString()
	offset?: string;

	@IsNumberString()
	limit?: string;
}
ts
import { router } from "koa"
import { validateQuery } from "@valideer/koa";

const router = new Router();
const controller = new Controller;

router.get(
    "/",
    validateQuery(UserQuery),
    controller.getAll
);

The next example shows hot to type the route and assing the validateQuery middleware.

ts
import { Router } from "express";
import { validateAndParseQuery } from "@valideer/express";

const router = Router();
const controller = new LocationController();

router.get(
    "/", 
    validateAndParseQuery(UserQuery, parseUserParsedQuery), 
    kcontroller.getAll
);

Validate and parse

The following example shows how to define you query validation class and parsed query class.

ts
export class UserQuery {
	@IsNumberString()
	offset?: string;

	@IsNumberString()
	limit?: string;
}

export const parseUserParsedQuery = (query: UserQuery) => new UserParsedQuery(query);

export class UserParsedQuery implements IPaginationOptions {
	limitMax = 100;

	options: {
		limit: number;
		skip: number;
	} = {
		limit: 32,
		skip: 0,
	};

    filter: {
        id?: number
    }

	constructor(query: UserQuery) {
		if (query.limit) this.options.limit = Math.max(0, Math.min(parseInt(query.limit, 10), this.limitMax));
		if (query.offset) this.options.skip = parseInt(query.offset, 10);
	}

}

The next example shows hot to type the route and assing the validateAndParseQuery middleware.

ts
import { router } from "koa"
import { validateAndParseQuery } from "@valideer/koa";


const router = new Router();
const controller = new Controller;

router.get<null, IParsedQueryState<UserParsedQuery>(
    "/",
    validateAndParseQuery(UserQuery, parseUserParsedQuery),
    controller.getAll
);
ts
import { Router } from "express";
import { validateAndParseQuery } from "@valideer/express";


const router = Router();
const controller = new LocationController();

router.get(
    "/", 
    validateAndParseQuery(UserQuery, parseUserParsedQuery), 
    kcontroller.getAll
);

And the last example showing how to type the request handler and extract the query from the request state/locals.

ts
import { Middleware } from "koa"
import { IParsedQueryState } from "@valideer/koa";

const getAll: Middleware<IParsedQueryState<LocationQueryParsed>> = (ctx) => {
    const query = ctx.state.parsedQuery

	const client = new MongoClient(uri);
	const cursor = await client.db("").collection("users").find(query.filter, query.options);
	const users = await cursor.toArray(),

    res.body = {users};
}
ts
import { RequestHandler } from "express"
import { IParsedQueryState } from "@valideer/koa";

const getAll: RequestHandler<null, null, null, null, IParsedQueryState<LocationQueryParsed>> = async (req, res, next) => {
    const query = res.locals.parsedQuery

	const client = new MongoClient(uri);
	const cursor = await client.db("").collection("users").find(query.filter, query.options);
	const users = await cursor.toArray(),

    return res.json({users});
};