我在续集模型中编写了一个BeforeCreate挂钩。当我点击创建用户路由时,它说user.user_id不能为null,甚至在创建钩子函数未执行之前也不能为null。我一直在跟踪sequelize的文档,它们提到的方式与我使用的相同。我在我的sequelize模型中编写了一个BeforeCreate钩子。当我点击创建用户路由时,它说user.user_id不能为null,甚至在创建钩子函数未执行之前也不能为null。我一直在跟踪sequelize的文档。他们提到的内容与我使用的相同。
shortest_unique <- function(x)
{
n_uniq <- sapply(seq(max(nchar(x))), function(y) length(unique(substr(x, 1, y))))
trimws(substr(x, 1, which.max(n_uniq)))
}
df %>% mutate(first_word = word(names), short_name = shortest_unique(names))
#> # A tibble: 6 x 3
#> names first_word short_name
#> <chr> <chr> <chr>
#> 1 apple alpha apple apple a
#> 2 grapes beta grapes grapes
#> 3 orange gamma orange orange
#> 4 graphite alpha graphite graphit
#> 5 a bc a a bc
#> 6 apple gamma apple apple g
答案 0 :(得分:2)
user_id: {
type: Sequelize.STRING,
allowNull: false,
primaryKey: true,
unique: true
}
在本节中,我在beforeValidate挂钩之后设置了user_id allowNull = false
beforeCreate执行。但是在beforeValidate挂钩中,它引发了user.user_id===null
的错误原因,因此我允许了allowNull===true
,现在它可以正常工作了。
答案 1 :(得分:1)
尝试在这段代码中删除异步:
async (user, options)
答案 2 :(得分:0)
真正的答案(在其中一项评论中,但没有明确指出)是{1>}挂钩在模型验证后被应用。
这意味着,如果模型中有任何字段(例如beforeCreate
)不能为空,则Sequelize将在应用id
字段之前对此进行评估。在您的情况下,Sequelize永远无法达到beforeCreate
钩子,因为空beforeCreate
每次都无法通过验证。
您可以通过设置id
来解决此问题,从而绕过对您的(简短)空allowNull = true
的验证。但是更好的选择(而不是通过允许空id
来扭曲模型)几乎可以肯定是使用正确的钩子:id
。在评估模型标准之前 应用此钩子。
这是一个非常简单的更改:
beforeValidate
注意:User.beforeValidate(async (user, options) => {
console.log("inside hooks");
let id = `user_${shortid.generate()}`;
user.user_id = id;
});
在这里是多余的。