Keystone JS中的validation错误

我试图build立一个非常相似的keystone演示中使用的联系表单,但我已经打了一个路障,虽然试图保存到分贝,我得到以下错误

{ message: 'Validation failed', name: 'ValidationError', errors: { name: { name: 'ValidatorError', path: 'name', message: 'Name is required', type: 'required' } } } 

我已经检查了窗体上的字段和请求在后台做了一个console.log,但由于某种原因,我仍然继续得到相同的错误。

这是我的玉档

 section#contact-container section#contact.contact-us .container .section-header // SECTION TITLE h2.white-text Get in touch // SHORT DESCRIPTION ABOUT THE SECTION h6.white-text | Have any question? Drop us a message. We will get back to you in 24 hours. if enquirySubmitted .row h3.white-text.wow.fadeInLeft.animated(data-wow-offset='30', data-wow-duration='1.5s', data-wow-delay='0.15s') Thanks for getting in touch. else .row form#contact.contact-form(method="post") input(type='hidden', name='action', value='contact') .wow.fadeInLeft.animated(data-wow-offset='30', data-wow-duration='1.5s', data-wow-delay='0.15s') .col-lg-4.col-sm-4(class=validationErrors.name ? 'has-error' : null) input.form-control.input-box(type='text', name='name', value=formData.name, placeholder='Your Name') .col-lg-4.col-sm-4 input.form-control.input-box(type='email', name='email', value=formData.email, placeholder='Your Email') .col-lg-4.col-sm-4 div(class=validationErrors.enquiryType ? 'has-error' : null) input.form-control.input-box(type='text', name='enquiryType', placeholder='Subject', value=formData.enquiryType) .col-md-12(class=validationErrors.message ? 'has-error' : null) .col-md-12.wow.fadeInRight.animated(data-wow-offset='30', data-wow-duration='1.5s', data-wow-delay='0.15s') textarea.form-control.textarea-box(name='message', placeholder='Your Message')= formData.message button.btn.btn-primary.custom-button.red-btn.wow.fadeInLeft.animated(data-wow-offset='30', data-wow-duration='1.5s', data-wow-delay='0.15s', type='submit') Send Message 

这就是我的架构和路由文件的样子

  var keystone = require('keystone'), Types = keystone.Field.Types; var Enquiry = new keystone.List('Enquiry', { nocreate: true, noedit: true }); Enquiry.add({ name: { type: Types.Name, required: true }, email: { type: Types.Email, required: true }, enquiryType: { type: String }, message: { type: Types.Markdown, required: true }, createdAt: { type: Date, default: Date.now } }); Enquiry.schema.pre('save', function(next) { this.wasNew = this.isNew; next(); }); Enquiry.schema.post('save', function() { if (this.wasNew) { this.sendNotificationEmail(); } }); Enquiry.schema.methods.sendNotificationEmail = function(callback) { var enqiury = this; keystone.list('User').model.find().where('isAdmin', true).exec(function(err, admins) { if (err) return callback(err); new keystone.Email('enquiry-notification').send({ to: admins, from: { name: 'Wheatcroft Accounting', email: 'contact@abc.com' }, subject: 'New Enquiry for **', enquiry: enqiury }, callback); }); }; Enquiry.defaultSort = '-createdAt'; Enquiry.defaultColumns = 'name, email, enquiryType, createdAt'; Enquiry.register(); 

这是路由文件

  var keystone = require('keystone'), async = require('async'), Enquiry = keystone.list('Enquiry'); exports = module.exports = function(req, res) { var view = new keystone.View(req, res), locals = res.locals; locals.section = 'contact'; locals.formData = req.body || {}; locals.validationErrors = {}; locals.enquirySubmitted = false; view.on('post', { action: 'contact' }, function(next) { var newEnquiry = new Enquiry.model(); var updater = newEnquiry.getUpdateHandler(req); updater.process(req.body, { flashErrors: true, fields: 'name, email, enquiryType, message', errorMessage: 'There was a problem submitting your enquiry:' }, function(err) { if (err) { locals.validationErrors = err.errors; console.log(err); } else { locals.enquirySubmitted = true; } next(); }); }); view.render('contact'); } 

我相信这个问题与KeystoneJS内部处理Types.Name字段types的方式有关。

在你的jade文件中,你应该使用一个path来引用你的name字段的虚拟name.full属性。 在name.full内部有一个setter,把name分成name.firstname.last 。 所以,如果你想分开input名字和姓氏,你应该使用name.firstname.last 。 如果你想单个inputinput全名,你应该使用name.full

尝试replace名称字段的input控件:

 input.form-control.input-box(type='text', name='name', value=formData.name, placeholder='Your Name') 

有了这个:

 input.form-control.input-box(type='text', name='name.full', value=formData['name.full'])