Sails.JS关联验证

时间:2015-01-14 11:35:16

标签: sails.js waterline

我在Sails.JS中使用了几个一对多的关联,如下所示:

用户

email: {
    type: 'string',
    required: true,
    unique: true
},
projects: {
    collection: 'project',
    via: 'user'
}

项目

name: {
    type: 'string',
    required: true,
    minLength: 3,
    maxLength: 50
},
user: {
    model: 'user',
    required: true
},
sites: {
    collection: 'site',
    via: 'project'
}

网站

project: {
    model: 'project',
    required: true
},
name: {
    type: 'string',
    required: true
}

现在,当我向/ project发出POST请求时,它会创建项目,并指定参数' user' (取自会话)将项目与该特定用户相关联。

创建新网站时也是如此。但是,我似乎能够为参数项目指定任何数字,即使该特定项目ID不存在也是如此。如果项目不存在而不创建站点,它确实应该无法通过验证。我认为它会查找与项目的关联,并检查指定的项目ID是否有效?

此外,我只希望能够创建与属于当前用户的项目相关联的站点。我该怎么做呢?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我不确定它是否是您不存在的项目ID关联的错误或预期行为,但一种解决方法是在模型中使用beforeCreate挂钩来验证项目ID存在:



// In your Site model
beforeCreate: function(values, next) {
  ...
  var projectID = values['project'];
  Project.findOne(projectID, function (err, project) {
    if (err || !project) return next("some error message");
    return next();
  });
}




您还可以在beforeCreate挂钩中查看第二个问题:



// In your Site model
beforeCreate: function(values, next) {
  ...
  var projectID = values['project'];
  Project.findOne(projectID).populate('user').exec(function (err, project) {
    if (err || !project) return next("some error message");
    if (project.user.id != values['userID']) return next("some other error message");
    return next();
  });
}




请注意,您必须通过' userID'作为创建网站实例的参数的参数。