当表单设置为 enctype='multipart/form-data' 时,表达式验证器给出未定义的值



,因此我使用基本node.js express制作此登录验证应用程序。因此,当我从"寄存器"页面中获取值(名称,电子邮件等(时,我将使用Express-Validator验证值。但是,当注册页面表单具有enctype ='multipart/form-data'时,我会得到每个值不确定的(名称,电子邮件等(。但是,当我删除enctype ='multipart/form-data'时,这些值就可以了!

所以有什么解决方案吗?我只是node.js的初学者

(p.s。我需要enctype ='multipart/form-data',因为我在注册时正在上传一个配置文件图(

(代码中的P.S我已删除了中间Wares,以显示Just Register.Jade及其路线的最小代码(

我在不使用enctype ='multipart/form-data'的情况下成功注册了,但是在这里我无法上传图像。

(p.s。使用multer进行文件上传(

./app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var logger = require('morgan');
var expressValidator = require('express-validator');
var session = require("express-session");
var passport = require("passport");
var localStratergy = require("passport-local").Strategy;
var multer = require("multer");
var upload = multer({dest: './uploads'});
var flash = require("connect-flash");
var bcrypt = require("bcryptjs");
var moongo = require("mongodb");
var mongoose = require("mongoose");
var db = mongoose.connection;
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
const { check, validationResult } = require('express-validator');
var app = express();
app.use('/', indexRouter);
app.use('/users', usersRouter);

module.exports = app;

./路由/user.js

var express = require('express');
var router = express.Router();
var multer = require("multer");
var bodyParser = require('body-parser');
var passport = require("passport");
var LocalStrategy = require("passport-local").Strategy;
var User = require('../models/user');
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: false }));
var upload = multer({dest: './uploads'});
const {check, validationResult} = require('express-validator');
/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});
router.get('/register', function(req, res, next) {
  res.render('register', {title: 'Register'});
});
router.post('/register', [
  check('name' , 'Name Field is required').not().isEmpty(),
  check('email', 'Email Field is required').not().isEmpty(),
  check('email', 'Email Field is not valid').isEmail(),
  check('username', 'Username Field is required').not().isEmpty(),
  check('password', 'Password Field is required').not().isEmpty(),
  check('password2', 'Passwords do not match').custom(
    (value, {req, loc, path}) => {
      if( value != req.body.password) {
        throw new error("Passwords do not match");
      } else{
        return value;
      }
    })
], upload.single('profileimage'),function(req, res, next) {
  var name = req.body.name;
  var email = req.body.email;
  var username = req.body.username;
  var password = req.body.password;
  var password2 = req.body.password2;
  if(req.file){
    console.log("Uploading");
    var profileimage = req.file.filename;
  } else{
    console.log("No File Selected");
    var profileimage = "noimage.jpg";
  }
  const errors = validationResult(req);
  if(!errors.isEmpty()){
    res.render('register', {
      error: errors.array()
    })
  } else{
    var newUser = new User({
      name: name,
      email: email,
      username: username,
      password: password,
      profileimage: profileimage
    });
    User.createUser(newUser, function(err, user){
      if(err) throw err;
      console.log(user);
    });
    req.flash('success', 'You have now registered');
    res.location('/');
    res.redirect('/');  
  }
});

module.exports = router;

./views/register.jade

extends layout
block content
    h2.page-header Register
    p Please Register Below   
    if error
        each errors, i in error
            div.alert.alert-danger    #{errors.msg}
    form(action="/users/register", method="post" enctype='multipart/form-data')
        .form-group
            label Name
            input.form-control(name="name", type="text", placeholder="Enter Name", class="name")
        .form-group
            label Email
            input.form-control(name="email", type="email", placeholder="Enter Email")
        .form-group
            label Username
            input.form-control(name="username", type="text", placeholder="Enter Username")
        .form-group
            label Password
            input.form-control(name="password", type="password", placeholder="Enter password")
        .form-group
            label Retype Password
            input.form-control(name="password2", type="password", placeholder="Enter password again")
        .form-group
            label Profile Image
            input.form-control(name="profileimage", type="File")
        input.btn.btn-primary(type="submit", name="submit", value="Register")

我希望我的图像上传确实包含enctype ='multipart/form-data',并且其余值不会设置为未定义,因为那时我的Express-validator无法正常工作

我解决了修改中间订单(在路由器(中的问题:首先必须multer,然后进行Express-validator。(我认为这是因为Multer在Req.body中添加了字段,因此:首先,您必须添加这些字段,然后进行验证。

这样,它起作用,因为multer首先出现:

router.post('/register',multerUploadUser.single('user_photo'), verificationRegister,  userController.registerUpload);

以这种方式,不是:

router.post('/register', verificationRegister, multerUploadUser.single('user_photo'),  userController.registerUpload);

您对'multipart/form-data'的使用可防止表达出其他表单字段的值。解决此问题的最简单方法是使用解析多部分表单的中间件,并使您可以访问字段和图像/s。

有几个这样的中间件软件包,每个软件包都有自己的支持/文档/记录记录:Multer,Busboy,Multiparty等。过去,我在几个项目中都使用过多方,但没有问题,但是有更新的软件包。

最新更新