Node.js 基于角色的验证在环回中不起作用

Node.js 基于角色的验证在环回中不起作用,node.js,validation,loopbackjs,Node.js,Validation,Loopbackjs,我有两个角色,希望根据传入数据中的角色字段对传入的post请求应用不同的数据验证规则,即,如果发布的角色是admin,则验证输入是否有name字段,如果角色是user,则验证输入是否有age。我在create方法的beforemote钩子中编写了如下验证代码: if (role === "admin") { Members.validatesPresenceOf('name'); next(); } else { Members.validatesPres

我有两个角色,希望根据传入数据中的角色字段对传入的post请求应用不同的数据验证规则,即,如果发布的角色是admin,则验证输入是否有name字段,如果角色是user,则验证输入是否有age。我在create方法的beforemote钩子中编写了如下验证代码:

 if (role === "admin") {
      Members.validatesPresenceOf('name');
      next();
 } else {
      Members.validatesPresenceOf('age');
      next();
 }

对于第一个请求,如果角色是admin,则验证工作并捕获输入中不存在的名称。但对于下一个请求(如果角色是用户),仍然会发生名称字段而不是年龄的验证错误。然后,如果我重新启动节点服务器并首先尝试使用用户角色,则会捕获年龄验证,但对于所有后续请求,将检查年龄验证,而不考虑角色。有什么问题吗?如果有任何其他方法来实现这一点,请让我知道。提前谢谢

验证是模型的永久性验证。这种方式行不通

您需要创建自定义验证器:

Members.validateAsync('name', function(err, done){
  var role = getRole();
  if(role === 'admin'){
    if(!this.name) err();
  }
  done();
}, {message: 'name should be filled'});

Members.validateAsync('age', function(err, done){
  var role = getRole();
  if(role !== 'admin'){
    if(!this.age) err();
  }
  done();
}, {message: 'age should be filled'});

模型的验证是永久性的。这种方式行不通

您需要创建自定义验证器:

Members.validateAsync('name', function(err, done){
  var role = getRole();
  if(role === 'admin'){
    if(!this.name) err();
  }
  done();
}, {message: 'name should be filled'});

Members.validateAsync('age', function(err, done){
  var role = getRole();
  if(role !== 'admin'){
    if(!this.age) err();
  }
  done();
}, {message: 'age should be filled'});

由于请求是注册请求,是否可以检查输入请求中的角色字段是否包含validateAsync函数中的管理员或用户?@DevStar在注册阶段没有用户!可能您将用于注册的角色以数据的形式发送到服务器。实际上,保存的两个角色用于移动和web请求。来自移动设备的请求将有一个角色在请求中发送,另一个角色用于来自web后端的请求。@DevStar我在回答中提供的解决方案是通用的。您可以检查请求来源中的角色或任何您想要的内容。重要的是,你需要像我在回答中提到的那样进行验证。验证是永久性的。您可以定义一次验证。因此,任何角色检查都应该在验证函数中。如果请求是注册请求,是否可以检查输入请求中的角色字段是否包含ValidateSync函数中的管理员或用户?@DevStar在注册阶段没有用户!可能您将用于注册的角色以数据的形式发送到服务器。实际上,保存的两个角色用于移动和web请求。来自移动设备的请求将有一个角色在请求中发送,另一个角色用于来自web后端的请求。@DevStar我在回答中提供的解决方案是通用的。您可以检查请求来源中的角色或任何您想要的内容。重要的是,你需要像我在回答中提到的那样进行验证。验证是永久性的。您可以定义一次验证。因此,任何角色检查都应该在验证函数中进行