node.js - 自定义验证错误被设置多次

标签 node.js loopbackjs strongloop

我通过以下方式为我的模型属性之一创建了自定义验证:

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();
  }

此验证工作正常,除了验证被多次调用(仍然没有问题),但随后多次将“最低操作系统版本太低”错误添加到返回的错误对象 ob 环回中。

returned data

我是否遗漏了什么或者为什么这个错误被填充了 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() 回调。完成后。

关于node.js - 自定义验证错误被设置多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34653374/

相关文章:

javascript - 限制用户访问环回中其他信息的最佳方法是什么?

rest - Strongloop Loopback REST 查询和/或与两者之间的结合

javascript - Strongloop 中的授权和身份验证

mysql - 如何使用正则表达式在mysql中搜索JSON数据

node.js - 我无法在 CENTOS 中安装 NODEJS...为什么?

node.js - Heroku 错误 : Cannot find module './config/keys'

javascript - 使用socket-io制作一个基本的聊天应用程序

javascript - 如何使用 Amazon EC2 和 heroku 通过 node.js 创建子页面

node.js - 在单个密码查询nodejs中创建多个不同 Node 之间的关系

javascript - 如何使用 .push 保存数组以在 .map() 之外异步读取?