2016-05-21 3 views
3

Я пытаюсь представить сценарий проверки формы как router.post, так и router.get в router.use. Я получаю данные из полей ввода с req.body.value. Это работает в router.post, но не в router.use. Я получаю следующее сообщение об ошибке (TypeError: Cannot read property 'length' of undefined) для этого кода:Экспресс: Почему нельзя использовать req.body.value в router.use?

router.use('/', (req, res, next) => { 
    if(req.body.firstname.length === 0 || !req.body.firstname.match(/\D+/igm)) { 
    var validateFirstname = false; 
    } else { 
    var validateFirstname = true; 
    }; 

    if(validateFirstname === true) { 
    console.log('SUCCESS: Form validated!'); 
    } else { 
    console.log('ERROR: Form not validated!'); 
    }; 
    next(); 
}); 

Кто-то может мне объяснить, почему это? Невозможно реализовать этот оператор if else в router.use? Позже это станет огромной помощью для отправки html div обратно пользователю, когда форма проверена внутри router.get.

UPDATE:

Проблема с моей проверки, что это проверка формы после нагрузки, когда они пусты, поэтому возвращение undefined. Но req.body работает без проблем в router.use при заполнении данными. Есть ли способ проверить поля ввода, кроме загрузки страницы?

+0

Вы используете синтаксический анализ промежуточного программного обеспечения, такого как body-parser, прежде чем использовать эту функцию промежуточного программного обеспечения? – kinakuta

+0

Да, не в этом роутере, а в моем 'app.js', с' extended: true' и 'json()'. – Lanti

+1

Запросы GET не имеют тела, только POST, поэтому используйте '.post', если необходимо – dandavis

ответ

4

Как хорошая альтернатива, как вы можете организовать проверку, я предлагаю использовать модуль express-validator.

Образец

var util = require('util'), 
    express = require('express'), 
    expressValidator = require('express-validator'), 
    app = express.createServer(); 

app.use(express.bodyParser()); 

// this line must be immediately after express.bodyParser()! 
app.use(expressValidator([options])); 

app.post('/:urlparam', function(req, res) {  
    // VALIDATION 
    // checkBody only checks req.body; none of the other req parameters 
    // Similarly checkParams only checks in req.params (URL params) and 
    // checkQuery only checks req.query (GET params). 
    req.checkBody('postparam', 'Invalid postparam').notEmpty().isInt(); 
    req.checkParams('urlparam', 'Invalid urlparam').isAlpha(); 
    req.checkQuery('getparam', 'Invalid getparam').isInt(); 
    ... 
    var errors = req.validationErrors(); 
    ... 
}); 
2
req.param(name [, defaultValue]) 

    Deprecated. Use either req.params, req.body or req.query, as applicable. 

Это то, что вы хотите, уже отмеченные осуждается. Если вы подтвердите это, забудьте использовать req.param всюду, избегайте обхода проверки.

+0

Спасибо! 'req.params' заменяет это? – Lanti

+1

№ req.params, req.body, req.query существуют независимо друг от друга, пожалуйста, прочитайте документ более подробно. Имя переменной может существовать в req.params и req.body и req.query одновременно, req.param() просто извлекает его по указанному порядку, если вы обращаетесь к нему непосредственно в req.params или req.body или req.query, он обходит ваш валидатор. – tangxinfa

Смежные вопросы