codecoolture / next-joi Goto Github PK
View Code? Open in Web Editor NEWValidate NEXT.js API Routes with joi
License: MIT License
Validate NEXT.js API Routes with joi
License: MIT License
Hi,
I am just learning how to develop with nextjs and am planning to use API routes. Like with any API, I understand there needs to be some validation.
To my great surprise, I can hardly find any information on how to validate nextjs API routes. I had believed it would be a much more common use case. The closest information is your package, and it has around 300 downloads this week; a number I thought would be higher.
Therefore, I am wondering if you can help me understand how most people validate their nextjs API routes? Also, is the lack of information due to the fact that people aren't using nextjs API routes?
Thank you for any help.
Following the readme exactly, I am getting the following lint error from my lib/middlewares/validation.ts
file.
Type '(_: NextApiRequest, res: NextApiResponse<any>) => NextApiResponse<any>' is not assignable to type 'OnValidationError'.
Type 'NextApiResponse<any>' is not assignable to type 'void | Promise<void>'.
Type 'ServerResponse & { send: Send<any>; json: Send<any>; status: (statusCode: number) => NextApiResponse<any>; redirect(url: string): NextApiResponse<...>; redirect(status: number, url: string): NextApiResponse<...>; setPreviewData: (data: string | object, options?: { ...; } | undefined) => NextApiResponse<...>; clearPr...' is missing the following properties from type 'Promise<void>': then, catch, finally, [Symbol.toStringTag]ts(2322)
package.json:
"dependencies": {
"@prisma/client": "^3.8.1",
"joi": "^17.5.0",
"next": "12.0.8",
"next-joi": "^2.2.1",
"prisma-client": "^0.0.0",
"react": "17.0.2",
"react-dom": "17.0.2"
},
"devDependencies": {
"@types/node": "^17.0.10",
"@types/react": "17.0.38",
"eslint": "8.7.0",
"eslint-config-next": "12.0.8",
"prisma": "^3.8.1",
"ts-node": "^10.4.0",
"typescript": "^4.5.5"
}
I am trying to add a default value to an optional parameter, but Joi.default()
doesn't seem to take effect.
My code looks somehow like this:
const params = Joi.object({
language: Joi.string().default('en-us')
})
export default validate({ body: params }, async (req, res) => {
console.log(req.body.language) // outputs undefined if not passed
})
I'm guessing either I shouldn't access body with req.body
or this is not supported, is it?
Thanks in advance.
Line 30 in 0a5b726
Hi there! Are there any plans to support Next 10?
Edit: This is a peer dependency issue that comes from NPM 7 changing how peer dependencies work.
how get error message from joi validation?
`import withJoi from "next-joi";
export default withJoi({
onValidationError: (req, res) => {
return res.status(400).end();
},
});`
Hello,
I am using next-joi with next-connect and it works great.
I was wondering if there is a way for the request handler to receive the validated/converted payload.
For example:
const schema = Joi.object({
name: Joi.string().trim(),
number: Joi.number().integer(),
})
req.body = {
name: " dummy ",
number: "5",
}
const handler = nextConnect().post( validate({ body: schema }), async (req, res) => {
const { name, number } = req.body
// Here name and number are the original values
// I would like them to be "dummy" and 5 (name trimmed and number casted to int)
})
It'd be helpful if
Line 27 in 7b9e340
Thanks for this small little, but handy middleware. Great work ๐
I extended the default request interface to have a strongly typed parameter and thought, maybe this is also useful for others, or maybe it could even be integrated.
import type { NextApiRequest, NextApiResponse } from 'next'
export interface ValidatedApiRequest<Body = any, Query extends NextApiRequest['query'] = NextApiRequest['query']> extends NextApiRequest {
body: Body
query: Query
}
const query = Joi.object({
id: Joi.string().required(),
});
async function handler(
req: ValidatedApiRequest<undefined, {id: string}>,
res: NextApiResponse
) {
//...
}
export default validator({query}, handler;
For example, I don't need GET
requests to be validated, only POST
.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.