使用Flash + Express-Validator进行Node.js + Express表单验证

时间:2018-01-26 18:51:24

标签: node.js forms express passport.js express-validator

我有一个HTML表单,我想在我的网站上验证它是 NOT 一个登录表单。

这是一个简单的HTML表单:

  <form method= "post">
    <div id= bookingFields>
      <label>Name</label> <input class = "userInfo" id="name" name="name" type="text"/>
      <label>Email</label> <input class = "userInfo" id="email" name="email" type="text"/>
      <label>Guests</label> <input class = "userInfo" id="guestCount" name="guestCount" type="number" min="1" max="8"/>
      <label>Date</label> <input class = "userInfo" id="dateRange" name="dateRange" type="text"/>
    </div>
    <input type="submit" value="Request to Book">
    <div>
  </form>

该网站用于预订度假屋,因此我需要验证的唯一字段是名称是否大于2个字符,如果该电子邮件是有效的电子邮件地址......就是这样。我还有FullCalendar.io运行可用日期的日历,我可能喜欢整合到日期选择器字段中,但我现在不会担心这一点。

这是我正在尝试做的事情:

我希望用户能够填写此表单并在发布到具有错误和反馈的MongoDB服务器之前对其进行验证,以便用户进行更正。我正在使用Node.js + Express作为我的后端,我正在尝试使用flash将这些消息显示给用户。我在flashexpress-validatorexpress-sessionpassportexpress-flash messages等的这个兔子洞里冒险了很多,他们似乎都需要彼此上班。但似乎所有这些中间件的目的是验证和处理登录,并保持用户在页面之间登录,并请求请求。

我是否甚至需要这个我正在尝试做的事情?

我想使用express-validator,因为清理,修剪和验证表单的方法看似简单明了。但是我需要express-session来执行此操作,这需要passport使用flash向用户发送消息,这对我正在尝试完成的事情来说似乎有些过分。我真的只想在trim()上使用isLength()sanitizeBody()express-validator方法,并使用flash向用户显示消息。多数民众赞成。

我的网站上没有登录信息,我尝试验证的所有表单只存在于一个页面上。我可以使用flashexpress-validator吗?有没有更好的办法?

继承我的index.js文件中的get / post请求:

router.get('/availibility', (req, res) => {
  res.render('availibility');
});

router.post('/availibility', passport.authenticate('local', { 
     successRedirect: '/',
     failureRedirect: '/availibility'
})
//req.check('name', 'Name must be longer than 2 letters').isLength({min:2});
//req.check('email','Must be a valid email').isEmail();
);

我在我的broswer Unknown authentication strategy “local”说错了。您可以通过注释掉的行看到我试图使用express-validator方法来验证表单。但是,如果没有使用express-session flash,我似乎无法使用passport,如果没有const express = require('express'); const path = require('path'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); const routes = require('./routes/index'); const flash = require('express-flash-messages'); const passport = require('passport'); const LocalStrategy = require('passport-local').Strategy; const errorHandlers = require('./handlers/errorHandlers'); const expressValidator = require('express-validator'); const session = require('express-session'); const app = express(); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); app.use(express.static(path.join(__dirname, 'public'))); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(expressValidator()); app.use(cookieParser()); app.use(session({ secret: process.env.SECRET, resave: false, saveUninitialized: false, })); app.use(passport.initialize()); app.use(passport.session()); passport.use(new LocalStrategy({ usernameField : 'username', passwordField : 'password' }, (req, username, password, done) => { // This was copy/pasted from another StackOverflow post that didn't answer my question ... .. })); } app.use(flash()); app.use((req, res, next) => { res.locals.flashes = req.flash(); res.locals.currentPath = req.path; next(); }); app.use('/', routes); module.exports = app; ,所有这些都无效。我不需要验证登录,所以我想知道我是否需要这个或者是否有更好的方法来解决它。

这是我的app.js文件 AS IS

{{1}}

提前致谢!!

0 个答案:

没有答案