Reputation: 152
I am trying to get express-validator working, but although I am following the example, I can't get it working. It gives me: "uncaughtException: body is not a function". I'm using express-validator version: 5.3.1
console.log(body);
gives "undefined".
var express = require('express');
var router = express.Router();
var {body, validationResult } = require('express-validator');
router.post('/', [
console.log(body),
body('name', 'name is required').isLength({min: 2}).not().isEmpty().escape(),
body('email', 'email must be a valid email format').not().isEmpty().isEmail().normalizeEmail(),
body('subject', 'subject is required').not().isEmpty().escape(),
body('content', 'content is required').not().isEmpty().trim().escape()
],
(req, res, next) => {
if(recaptcha check succeeds)
{
var errors = validationResult(req);
if(errors) {
console.log(errors);
callback(errors);
}
else {
console.log('No errors');
callback(undefined);
}
}
});
if I adjust to:
var validator = require('express-validator');
router.post('/', [
console.log(validator)
],
(req, res, next) => {
//things
});
it gives as output:
[Function: expressValidator] {
validator: {
version: '10.11.0',
toDate: [Function: toDate] { default: [Circular] },
toFloat: [Function: toFloat] { default: [Circular] },
toInt: [Function: toInt] { default: [Circular] },
toBoolean: [Function: toBoolean] { default: [Circular] },
equals: [Function: equals] { default: [Circular] },
contains: [Function: contains] { default: [Circular] },
matches: [Function: matches] { default: [Circular] },
isEmail: [Function: isEmail] { default: [Circular] },
isURL: [Function: isURL] { default: [Circular] },
isMACAddress: [Function: isMACAddress] { default: [Circular] },
isIP: [Function: isIP] { default: [Circular] },
...
...
},
utils: {
toString: [Function],
formatParamOutput: [Function: formatParamOutput],
mapAndExtend: [Function: mapAndExtend],
makeSanitizer: [Function: makeSanitizer],
replaceArgs: [Function: replaceArgs]
}
}]
So I can see what I need is somewhere in there, namely isEmail() and such. However, I must somehow tell the function I want to check it on the email. Since the documentation makes it clear you should do that with body('email').isEmail();
, I am not sure how to do this, since their example won't work for me.
Sorry if this ends up being simple. I don't have a lot of experience in NodeJs yet.
Upvotes: 1
Views: 4523
Reputation: 3280
According to express-validator documentation 6.6.0, you can rewrite your middleware to:
const express = require('express');
const router = express.Router();
const { body, validationResult } = require('express-validator');
validationBodyRules = [
body('login', 'login is required').exists(),
body('password', 'password is required').exists(),
body('login', 'login is required').notEmpty(),
body('password', 'password is required').notEmpty()
];
checkRules = (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
next();
};
router.post('/', validationBodyRules, checkRules, (req, res, next) => {
//validated body
console.log(req.body)
//things
});
app.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const expressValidator = require('express-validator');
const app = express();
cors({
credentials: true,
origin: true
});
app.use(cors());
app.use(bodyParser.json());
app.use(expressValidator()); //<--right after body-parser middleware
app.use(require('./server/index'));
app.get('*', (req, res) => {
res.status(404).json({ errors: [{location: req.path, msg: 'Not found', param: null}]});
});
server/index.js
fileValidation = (req, res, next) => {
req.checkBody('height', 'height é obrigatório').isInt({ min: 0 });
req.checkBody('width', 'width é obrigatório').isInt({ min: 0 });
req.checkBody('sequence', 'sequence é obrigatório').isInt({ min: 0 });
req.getValidationResult().then((result) => {
if (!result.isEmpty()) {
return res.status(400).json({ errors: result.array() });
}
return next();
});
};
addFile = (req, res) => {
let sql = 'INSERT INTO media_file(height, width,"exibitionTime", sequence, media, mimetype, img) VALUES ($1, $2, $3, $4, $5, $6, $7) returning *';
try {
const result = await postgres.client.query(sql, [req.body.height, req.body.width, req.body.exibitionTime, req.body.sequence, req.body.media, req.file.mimetype, req.file.buffer]);
res.status(201).json(result.rows[0]);
res.end();
} catch (err) {
return res.status(500).json({ errors: [{ param: undefined, msg: err.detail, value: undefined }] });
}
};
router.post('/files/', fileValidation, addFile);
module.exports = router;
Upvotes: 1