hagopj13 / node-express-boilerplate

A boilerplate for building production-ready RESTful APIs using Node.js, Express, and Mongoose
MIT License
6.66k stars 1.98k forks source link

Validation middleware isn't working with external validation #279

Closed yachtsman-dev closed 7 months ago

yachtsman-dev commented 7 months ago

In latest version of Joi validation when try to run validation it's giving error Schema with external rules must use validateAsync() When i try to replace validate method by validateAsync then it's stop executing other normal validation and giving me promise error like node:internal/process/promises:288 triggerUncaughtException(err, true /* fromPromise */); Is there any way to use external and normal validation with this middleware?

userAdityaa commented 7 months ago

I would like to work on it but can you give me a little more for the explanation as im not able to get to the problem.

userAdityaa commented 7 months ago

Or the promise error you are getting is must be because the validateAsync is an async function. so, you should use await first with the schema.validate

yachtsman-dev commented 7 months ago

I would like to work on it but can you give me a little more for the explanation as im not able to get to the problem.

I am using validate middleware, see this file. https://github.com/hagopj13/node-express-boilerplate/blob/master/src/middlewares/validate.js

This is my schema { body: Joi.object().keys({ Number: Joi.number().external(verifyNumber), TotalAmount: Joi.number().positive().greater(0).required(), Email: Joi.string().email().required(), Currency: Joi.string().required(), ExpiryMonth: Joi.number().when('type', { is: 'card', then: Joi.number().max(12).min(1).required() }), ExpiryYear: Joi.number().when('type', { is: 'card', then: Joi.number().min(moment().year()).required() }) }), }

This is external validation function const verifyNumber = async (value, helpers) => { try { const res = db function to check record and it's returning true or false; if (res) { return value } else { return helpers.message("Can't verify number, please contact us.") } } catch (error) { return helpers.message("Can't verify number, please contact us.") } };

In above Schema verifyNumber is my db function where i am verify number with database and return true if success else returning error message. If i use validateAsync in middleware then external validation work but other validation are giving error as mentioned in above details. If i use only validate instead of validateAsync in middleware then it's giving me error Schema with external rules must use validateAsync(). So now my problem is how can i use external and normal validation both by using above middleware?

@Aditya7842 hope you got all details, please check and let me know

userAdityaa commented 7 months ago

Kind of a new problem for me. But by doing some document reading i think this can fix your code to use the validateAsync in it.

Screenshot 2023-11-14 at 3 43 54 PM
yachtsman-dev commented 7 months ago

validateAsync

@Aditya7842 Yes it seems working. But only issue is if error on external validation then it's not giving errors with other validation errors. Once all other validations are fix then on next try it's giving error for external validation.