我在 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 请求时,它会很好地创建项目,并且指定参数"用户"(取自会话)会将项目与该特定用户相关联。
当我创建一个新网站时也是如此。但是,我似乎可以为参数"项目"指定任何数字,即使该特定项目 ID 不存在。实际上,如果项目不存在并且不创建站点,则验证应该失败。我以为它会查找与项目的关联并检查指定的项目 ID 是否有效?
此外,我只希望能够创建一个与属于当前用户的项目关联的网站。我将如何做到这一点?
提前谢谢。
我不确定这是不存在的项目 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"作为参数传递到用于创建站点实例的参数中。