[英]express-validator giving undefined value when form set to enctype='multipart/form-data'
所以我正在使用基本的 node.js+express 制作这个登录授权应用程序。 因此,当我从注册页面获取值(名称、email 等)时,我正在使用 express-validator 验证这些值。 但是,当注册页面表单具有 enctype='multipart/form-data' 时,我得到的每个值都未定义(名称、email 等)。 但是当我删除 enctype='multipart/form-data' 时,这些值就很好了!!
那么有什么解决办法吗? 我只是Node.js的初学者。
(PS 我需要 enctype='multipart/form-data' 因为我在注册时上传了个人资料图片)
(PS 在代码中我删除了中间件以显示 register.jade 及其路由的最少代码)
我在没有使用enctype='multipart/form-data'的情况下注册成功了,但是这里无法上传图片。
(PS使用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;
./routes/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' 并且 rest 的值不会设置为未定义,因为这样我的快速验证器就无法正常工作
我解决了修改中间件顺序(在路由器中)的问题:首先必须是 go 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.