Amber Elferink
Amber Elferink

Reputation: 152

Express-validator body is not a function

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

Answers (1)

Danizavtz
Danizavtz

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
});

Using earlier versions:

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

Related Questions