Express-validator主体不是功能

问题描述

我正在尝试使express-validator工作,但是尽管我遵循the example,但我无法使其工作。它给了我:“ uncaughtException:主体不是函数”。 我正在使用Express-Validator版本:5.3.1

Fit intercept: True r_sq: 0.9473 m: 0.0017 b: -0.0192 Fit intercept: False r_sq: 0.9112 m: 0.0014 b: 0.0000 给出“未定义”。

console.log(body);

如果我调整为:

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

它给出作为输出

var validator = require('express-validator');
router.post('/',[
console.log(validator)
],next) => {
//things
});

所以我可以看到我需要的是isEmail()之类的东西。但是,我必须以某种方式告诉我要在电子邮件中检查的功能。由于documentation清楚地表明您应该使用[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] } }] 进行此操作,因此我不确定如何执行此操作,因为他们的示例对我而言不起作用。 很抱歉,如果这样简单。我对NodeJ的经验还不够。

解决方法

根据express-validator documentation 6.6.0,您可以将中间件重写为:

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(),'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,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('*',res) => {
    res.status(404).json({ errors: [{location: req.path,msg: 'Not found',param: null}]});
});

服务器/index.js

fileValidation = (req,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;