我是新来的节点,当用户尝试提交表单时,尝试显示验证错误(使用express-validator和express 4)。node/express 4:在ajax post上使用express-validator显示错误
验证程序似乎工作,因为如果我将数据记录到控制台,一切都如预期。但是,当我渲染视图时,无法在页面上显示错误(不显示任何内容)。与我一直在进行快速验证的“标准”教程唯一的区别是,我使用AJAX发布数据。
我的代码如下。我使用来表明我删除了更多的代码,并且为了简洁起见我删除了一些表单域。
app.js
var express = require('express')
, indexController = require('./routes/index')
, membersController = require('./routes/members')
[...]
, cookieParser = require('cookie-parser')
, bodyParser = require('body-parser')
, expressValidator = require('express-validator');
var app = express();
[...]
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator()) // tried both placing it here or below
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// I realize this may be not optimal
app.use(function(req,res,next){
req.db = db;
next();
});
app.use('/', indexController);
app.use('/members', membersController);
[...]
module.exports = app;
handle_members.js
$(document).ready(function() {
$('#join_btn').click(function(event, req, res){
event.preventDefault();
var newMember = {
'name': $('#join_form input#join_name').val(),
'email': $('#join_form input#join_email').val()
}
$.ajax({
type: 'POST',
data: newMember,
url: '/members/addmember',
dataType: 'JSON'
}).done(function(response){
if (response.msg === 'success'){
alert('New member added successfully!')
}
// maybe this is not necessary?
else if (response.msg === 'validation'){
alert('validation failed');
}
else{
alert('Error: ' + response.msg)
}
});
});
});
members.js
var express = require('express');
var router = express.Router();
router.post('/addmember',validator, function(req, res) {
var db = req.db;
var collection = db.get('memberstest');
collection.insert(req.body, function(err, result){
res.send(
(err === null) ? { msg: 'success' } : { msg: err }
);
});
});
function validator(req, res, next) {
req.checkBody('email', 'not valid email').isEmail();
req.checkBody('name', 'cannot be empty').notEmpty();
var errors = req.validationErrors();
if (errors) {
console.log(errors) // these are as expected
res.render('index',{errors:errors}); // no errors displayed
}
else {
next();
}
};
module.exports = router;
index.jade
[...]
form#join_form(method='POST', action='', role='form')
div.form-group
input#join_name.form-control(type='text', name='join_name')
input#join_email.form-control(type='email', name='email')
button#join_btn.btn(type='button') join
if errors
ul
for error in errors
li = error.msg
[...]
的错误变量记录到控制台时,看起来是这样的:
[ { param: 'email', msg: 'not valid email', value: 'xxxx' }, { param: 'name', msg: 'can't be empty', value: '' } ]
在过去的几天我确实尝试了很多不同的东西,但没有一次成功。这个问题似乎总是一样的:所有的都很好,但是当我渲染视图时就像它从不输入“if errors ...”语句。也许我在这里错过了一些非常基本的东西?任何帮助非常感谢,谢谢。
PS。最终,表单理想情况下应该在模式/弹出窗口内,以防改变某些内容。
2017-07-31
Tommy
+0
你能呈现怎样的错误变量的样子: var data = {}; // data here $.ajax({ type: 'POST', data: data, url: '/addmember', dataType: 'JSON' }).done(function() { alert('done'); }).fail(function() { alert('fail'); });
使用res.json后端答案呢? –
2017-07-31 01:44:43
+0
@MarceloAlves确定我更新了这个问题。 –