sequelize beforeCreate挂钩未执行

时间:2020-04-03 11:34:49

标签: node.js sequelize.js

我在续集模型中编写了一个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

3 个答案:

答案 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)

真正的答案(在其中一项评论中,但没有明确指出)是{}挂钩在模型验证后被应用。

这意味着,如果模型中有任何字段(例如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; }); 在这里是多余的。