экспресс-валидатор, дающий неопределенное значение, когда для формы установлено значение enctype = 'multipart / form-data' - PullRequest
1 голос
/ 24 июня 2019

Итак, я создаю это приложение для авторизации с использованием базового node.js + express. Поэтому, когда я беру значения (имя, адрес электронной почты и т. Д.) Со страницы регистрации, я проверяю значения с помощью экспресс-валидатора. Но я получаю каждое значение undefined (имя, адрес электронной почты и т. Д.), Когда форма страницы регистрации имеет enctype = 'multipart / form-data'. Но когда я удаляю enctype = 'multipart / form-data', значения приходят просто отлично !!

Так какое-нибудь решение для этого? Я только начинающий в Node.js.

(P.S. Мне нужно enctype = 'multipart / form-data', потому что я загружаю изображение профиля во время регистрации)

(P.S. В коде я удалил промежуточное ПО, чтобы показать минимальные коды только для 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 * * 1016

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;

. / Просмотров / 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' для загрузки моего изображения и что остальным значениям не будет присвоено значение undefined, потому что тогда мой экспресс-валидатор не работает

1 Ответ

1 голос
/ 24 июня 2019

Использование 'multipart/form-data' не позволяет Express анализировать значения других полей формы. Самый простой способ обойти это - использовать промежуточное ПО, которое анализирует многочастные формы и предоставляет вам доступ как к полям, так и к изображениям.

Существует несколько таких промежуточных пакетов, каждый со своей собственной поддержкой / документацией / послужным списком: multer , busboy , multiparty и т. Д. Я использовал Многопартийность в нескольких проектах в прошлом, без проблем, но есть более новые пакеты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...