我是一个有环回的新手,有些东西我真的不明白钩子。
我有一个具有这些属性的模型"问题":- id - .. - .. - userId
我想做的是在调用 POST 请求以添加问题时检查用户表中是否已存在 userId。(并引发错误,但这已经起作用了)
所以我创建了一个保存钩子之前,它运行良好(引发错误等),但我无法阻止模型的添加,即使我在钩子中调用"next(err)"。
Question.observe('before save', function isInDb(ctx, next){
var PoemUser = app.models.PoemUser;
var PoemUserId = ctx.instance.id_author;
PoemUser.findOne({ where: {id: PoemUserId} } ,function(err,exists){
console.log('exist : ' +exists);
if (exists == null){
var err = new Error();
err.name = "id not existing"
err.status = 404; // don't know wich code use
err.message = "This user is not existing";
next(err);
};
});
});
};
我搜索了文档,但我认为我的方式并不好。
如果有人能向我解释做我想做的事情的好方法,那就太好了。
提前谢谢你!
使用钩子来防止模型添加是一个非常好的方法。我的印象是,您正试图在用户存在时阻止添加问题。
你能检查以下代码吗?
PoemUser.findOne({ where: {id: PoemUserId} }, function(err,exists){
if(err) {
next(error);
}
console.log('exist : ' +exists);
if (!exists){
var err = new Error();
err.status = 404; // don't know which code use
err.message = "User not found";
next(err);
} else {
next();
}
});
});
仔细检查属性名称,因为您提到问题模型包含userId
字段,但您正在尝试保存属性id_author
如ctx.instance.id_author
;
仅供参考:
-
ctx.instance
仅在保存新问题时可用,而不是在您更新问题时可用。 - 更新问题时,您将在
ctx.data
中获取实例。