自定义validation错误被设置多次

我使用以下方法为我的一个模型属性创build了自定义validation:

Model.validateAsync('minOsVersion', validateMinimumOsVersion, {message: 'Minimum OS Version incorrect'}); function validateMinimumOsVersion(err, done) { var requiredVersion = "some version"; var givenVersion = this.minOsVersion; if (validator.validateSemanticVersionString(givenVersion, requiredVersion) < 0) { err('too_low'); } done(); } 

这种validation工作正常,除了validation被多次调用(仍然没有问题),但随后多次向返回的错误对象ob loopback中添加“最小os版本太低”错误。

返回的数据

我错过了什么或为什么这个错误填充12次? 如果对这种特定情况的validation失败,则应该只添加一次。

有任何想法吗? 提前致谢。

编辑:根据请求,这是另一个代码,我的上传方法后被调用

 Model.observe('before save', function(ctx, next) { if (ctx.instance) { analyseMetadata(ctx.instance, function(error, model) { if (error) { return next(error); } next(); }); } else { next(); } }); function analyseMetadata(model, cb) { extractMetadata(model, function(error, data){ if (error) { return cb(error); } if (data && data.provisioning && data.metadata && data.entitlements) { model.updateAttribute("expires", data.provisioning.ExpirationDate); model.updateAttribute("created", data.provisioning.CreationDate); model.updateAttribute("appIdentifier", data.entitlements['application-identifier']); model.updateAttribute("teamIdentifier", data.entitlements['com.apple.developer.team-identifier']); model.updateAttribute("bundleIdentifier", data.metadata.CFBundleIdentifier); model.updateAttribute("displayName", data.metadata.CFBundleDisplayName); model.updateAttribute("bundleName", data.metadata.CFBundleName); model.updateAttribute("shortVersion", data.metadata.CFBundleShortVersionString); model.updateAttribute("bundleVersion", data.metadata.CFBundleVersion); model.updateAttribute("minOsVersion", data.metadata.MinimumOSVersion); model.updateAttribute("builtOsVersion", data.metadata.DTPlatformVersion); } cb(null, model); }); } 

在上传时更新属性,但是不会多次生成validation的更好方法是什么?

正如我在评论中提到的,你得到多个validation错误的原因是你多次调用updateAttribute() 。 相反,考虑使用updateAttributes() (复数forms)应该只调用validation方法(s)一次:

 function analyseMetadata(model, cb) { extractMetadata(model, function(error, data){ if (error) { return cb(error); } if (data && data.provisioning && data.metadata && data.entitlements) { model.updateAttributes({ "expires": data.provisioning.ExpirationDate, "created": data.provisioning.CreationDate, "appIdentifier": data.entitlements['application-identifier'], // ... }, function updateCallback(updateErr, updatedModel) { if (updateErr) { return cb(updateErr); } cb(null, updatedModel); }); } }); } 

还要注意,我添加了更新属性的callback。 这是一个asynchronous函数,实际上是执行更新,因此您需要完成执行您的cb()callback。