多次设置自定义验证错误
Custom validation errors gets set multiple times
我通过以下方式为我的模型属性之一创建了自定义验证:
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();
}
此验证工作正常,除了多次调用验证(仍然没问题),然后多次将 "minimum os version too low" 错误添加到返回的错误对象 ob loopback。
我是不是遗漏了什么或者为什么这个错误出现了 12 次?如果针对此特定案例的验证失败,则应仅添加一次。
有什么想法吗?提前致谢。
编辑:
根据要求,这是在我的上传方法之后调用的其他代码
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);
});
}
上传时更新属性但不多次生成验证的更好方法是什么
正如我在评论中提到的,您收到多个验证错误的原因是您多次调用 updateAttribute()
。相反,请考虑使用 updateAttributes()
(plural form),它应该只调用一次验证方法:
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);
});
}
});
}
另请注意,我添加了更新属性的回调。这是一个异步函数,实际执行更新,因此您需要在 完成 后执行 cb()
回调。
我通过以下方式为我的模型属性之一创建了自定义验证:
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();
}
此验证工作正常,除了多次调用验证(仍然没问题),然后多次将 "minimum os version too low" 错误添加到返回的错误对象 ob loopback。
我是不是遗漏了什么或者为什么这个错误出现了 12 次?如果针对此特定案例的验证失败,则应仅添加一次。
有什么想法吗?提前致谢。
编辑: 根据要求,这是在我的上传方法之后调用的其他代码
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);
});
}
上传时更新属性但不多次生成验证的更好方法是什么
正如我在评论中提到的,您收到多个验证错误的原因是您多次调用 updateAttribute()
。相反,请考虑使用 updateAttributes()
(plural form),它应该只调用一次验证方法:
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);
});
}
});
}
另请注意,我添加了更新属性的回调。这是一个异步函数,实际执行更新,因此您需要在 完成 后执行 cb()
回调。