Express-validator 主体不是函数

Express-validator body is not a function

我正在尝试让 express-validator 工作,但尽管我在关注 the example,但我无法让它工作。它给了我:“uncaughtException: body is not a function”。 我正在使用 express-validator 版本:5.3.1

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)
], 
(req, res, next) => {
//things
});

它作为输出给出:

[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]
  }
}]

所以我可以看到我需要的东西在那里的某个地方,即 isEmail() 等。但是,我必须以某种方式告诉我要在电子邮件中查看的功能。由于 documentation 清楚地表明您应该使用 body('email').isEmail(); 来做到这一点,我不确定该怎么做,因为他们的示例对我不起作用。 抱歉,如果这最终变得简单。我还没有很多 NodeJs 经验。

根据 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(),
    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 (, , , , , , ) 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;