Express-如何使用express-validator验证文件输入?

Cod*_*rts 4 validation express

我正在使用express-validator进行验证。在我的控制器中,我有一种向数据库添加新图片的方法。这是我的代码:

function createPicture(req, res) {

req.checkBody('title', `The title can't be empty.`).notEmpty();
req.checkBody('image', 'You must select an image.').notEmpty();

let errors = req.validationErrors();

if (errors) {
    res.json({errors: errors});
} else { ... }
Run Code Online (Sandbox Code Playgroud)

该代码适用于标题字段,但是无论是否选择图像,我仍然会收到有关其的验证错误。如何验证文件输入?我只是希望它是必需的。

ath*_*mos 10

为了验证文件输入字段,您可以使用multer:将主体对象和文件对象添加到请求对象的中间件。
然后使用链接到验证中间件的express-validator .custom()验证函数。

req.file使用 multer,可以通过文件输入字段和req.body其他输入字段(如果有)访问用户输入。

req.file将返回一个包含以下 6 个字段的对象:(pdf 的示例)

{
  fieldname: 'fileInputFieldName',
  originalname: 'uploaded_file.pdf',
  encoding: '7bit',
  mimetype: 'application/pdf',
  buffer: <Buffer 2 ... 192685 more bytes>,
  size: 192735
}
Run Code Online (Sandbox Code Playgroud)

假设您只想接受 pdf 文件:您可以根据上传文件的 mimetype 进行验证(可通过:访问req.file.mimetype):

// express-validator import
const { check, validationResult } = require('express-validator'); 

// multer import and setup
const multer = require('multer');
const storage = multer.memoryStorage(); // Holds a buffer of the file in memory
const upload = multer({ storage: storage });


exports.post_file = [
// multer middleware
upload.single('fileInputFieldName'),


// express-validator middleware
check('fileInputFieldName')
.custom((value, {req}) => {
        if(req.file.mimetype === 'application/pdf'){
            return '.pdf'; // return "non-falsy" value to indicate valid data"
        }else{
            return false; // return "falsy" value to indicate invalid data
        }
    })
.withMessage('Please only submit pdf documents.'), // custom error message that will be send back if the file in not a pdf. 


// process the request with validated user inputs
(res, req, next) => {
    ...
    ...
}
]
Run Code Online (Sandbox Code Playgroud)

  • 检查您的代码,您正在使用“.single”中间件,因此您应该使用“req.file”而不是“req.files”访问该文件。 (6认同)

小智 6

我遇到了同样的问题,由于express-validator仅验证字符串,因此以下代码将不起作用

req.checkBody('title', 'The title can't be empty.').notEmpty();

req.checkBody('image', 'You must select an image.').notEmpty();
Run Code Online (Sandbox Code Playgroud)

您需要编写一个自定义验证器,express-validator允许这样做,好吧,这是一个示例

//requiring the validator
var expressValidator = require('express-validator');
//the app use part
app.use(expressValidator({
customValidators: {
    isImage: function(value, filename) {

        var extension = (path.extname(filename)).toLowerCase();
        switch (extension) {
            case '.jpg':
                return '.jpg';
            case '.jpeg':
                return '.jpeg';
            case  '.png':
                return '.png';
            default:
                return false;
        }
    }
}}));
Run Code Online (Sandbox Code Playgroud)

要使用自定义验证器,请首先执行以下操作以确保空文件不会引发未定义的错误:

restLogo = typeof req.files['rest_logo'] !== "undefined" ? req.files['rest_logo'][0].filename : '';
Run Code Online (Sandbox Code Playgroud)

最后使用您的自定义验证器:

req.checkBody('rest_logo', 'Restaurant Logo - Please upload an image Jpeg, Png or Gif').isImage(restLogo);
Run Code Online (Sandbox Code Playgroud)

谢谢您的提问,希望对您有所帮助