- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何在 sequelize 上使用 beforeUpdate 钩子(Hook)中止更新操作并返回一个对象作为中止更新的结果,
如果我有类似的东西:
User.beforeUpdate(function(user, options) {
if (user.name == "example_name") {
// abort operation here
// return object to the update caller
}
}
最佳答案
throw
在钩子(Hook)阻止更新之前
例如:
beforeUpdate: (integerName, options) => {
if (integerName.value === 5) {
throw new Error('beforeUpdate')
}
},
并在 .update
调用者上抛出。
但请记住来自why sequelize beforeUpdate hook doesn't work?如果调用者使用:
Model.update({}, {individualHooks: true})
每次都要记住 pass 会很烦人。
beforeValidate
钩子(Hook)即使没有 individualHooks
也会触发,所以也许这就是方法。
关于 create throw 有效的事实记录在:https://sequelize.org/master/manual/hooks.html#instance-hooks
User.beforeCreate(user => {
if (user.accessLevel > 10 && user.username !== "Boss") {
throw new Error("You can't grant this user an access level above 10!");
}
});The following example will throw an error:
try {
await User.create({ username: 'Not a Boss', accessLevel: 20 });
} catch (error) {
console.log(error); // You can't grant this user an access level above 10!
};The following example will be successful:
const user = await User.create({ username: 'Boss', accessLevel: 20 });
console.log(user); // user object with username 'Boss' and accessLevel of 20
还提到:https://github.com/sequelize/sequelize/issues/11298
最小可运行示例:
主要.js
#!/usr/bin/env node
const assert = require('assert')
const path = require('path')
const { DataTypes, Sequelize } = require('sequelize')
let sequelize
if (process.argv[2] === 'p') {
sequelize = new Sequelize('tmp', undefined, undefined, {
dialect: 'postgres',
host: '/var/run/postgresql',
})
} else {
sequelize = new Sequelize({
dialect: 'sqlite',
storage: 'tmp.sqlite',
})
}
function assertEqual(rows, rowsExpect) {
assert.strictEqual(rows.length, rowsExpect.length)
for (let i = 0; i < rows.length; i++) {
let row = rows[i]
let rowExpect = rowsExpect[i]
for (let key in rowExpect) {
assert.strictEqual(row[key], rowExpect[key])
}
}
}
;(async () => {
const IntegerNames = sequelize.define('IntegerNames',
{
value: { type: DataTypes.INTEGER },
name: { type: DataTypes.STRING },
},
{
hooks: {
beforeCreate: (integerName, options) => {
if (integerName.value === 42) {
throw new Error('beforeCreate')
}
},
beforeValidate: (integerName, options) => {
if (integerName.value === 43) {
throw new Error('beforeValidate')
}
},
beforeUpdate: (integerName, options) => {
if (integerName.value === 5) {
throw new Error('beforeUpdate')
}
},
}
},
)
await IntegerNames.sync({ force: true })
async function reset() {
await sequelize.truncate({ cascade: true })
await IntegerNames.create({ value: 2, name: 'two' })
await IntegerNames.create({ value: 3, name: 'three' })
await IntegerNames.create({ value: 5, name: 'five' })
}
async function assertUnchanged() {
const rows = await IntegerNames.findAll()
assertEqual(rows, [
{ id: 1, value: 2, name: 'two', },
{ id: 2, value: 3, name: 'three', },
{ id: 3, value: 5, name: 'five', },
])
}
await reset()
let rows, exc
await assertUnchanged()
// beforeCreate
exc = undefined
try {
await IntegerNames.create({ value: 42, name: 'forty-two' })
} catch (e) {
exc = e
}
assert.strictEqual(exc.message, 'beforeCreate')
await assertUnchanged()
// beforeValidate
exc = undefined
try {
await IntegerNames.create({ value: 43, name: 'forty-three' })
} catch (e) {
exc = e
}
assert.strictEqual(exc.message, 'beforeValidate')
await assertUnchanged()
// beforeUpdate
exc = undefined
try {
await IntegerNames.update(
{ name: 'five hacked', },
{
where: { value: 5 },
individualHooks: true,
},
);
} catch (e) {
exc = e
}
assert.strictEqual(exc.message, 'beforeUpdate')
await assertUnchanged()
// using the beforeValidate
exc = undefined
try {
await IntegerNames.update(
{ value: 43, },
{
where: { value: 5 },
},
);
} catch (e) {
exc = e
}
assert.strictEqual(exc.message, 'beforeValidate')
await assertUnchanged()
})().finally(() => { return sequelize.close() })
包.json
{
"name": "tmp",
"private": true,
"version": "1.0.0",
"dependencies": {
"pg": "8.5.1",
"pg-hstore": "2.3.3",
"sequelize": "6.14.0",
"sql-formatter": "4.0.2",
"sqlite3": "5.0.2"
}
}
GitHub upstream .在 Ubuntu 21.10、PostgreSQL 13.5 上测试。
关于node.js - 如何使用 beforeUpdate Hook Sequelize 中止更新操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64362298/
我对嵌套域类有一个内部要求,我想将对父级关系的更新传播到子级。一个代码示例可以清楚地表明: class Milestone { static belongsTo = [project:Proj
我想将域类保存到数据库中而不指定createdUser或createdDate。我创建了一个名为AuditingInfo的对象,并将其嵌入到主要的Person域类中,如下所示: AuditingInf
我有一个简单的用户模型如下: 'use strict'; let hashPassword = (user, options) => { if (!user.changed('password
我有一个使用 TypeORM 的 NodeJS 后端服务器,每次更新实体时我都需要执行插入。所以我的 BaseModel 类中有以下代码: abstract class BaseModel { //
刚开始学习vue js,一直在试验一个递归树的例子,基于这个例子官方例子here 上面的示例以具有单根 后跟许多子元素的 treedata 开始,我试图将其扩展为具有多个根元素, 例子 here .
仅当满足某些条件时,我才需要加密密码。 beforeUpdate: function (value, cb) { User.findOne(value.id) .exec(function (er
我在 grails 项目中使用了 GORM API 反射(reflect)的 afterUpdate 方法。 class Transaction{ Person receiver; P
我正在使用 nodejs/express/sequelize 开发 API。 实际上是在我创建用户帐户时。由于 bcrypt,我得到了一个 Hook 'beforeCreate' 来散列用户密码: U
当我取消移动包含新项目的数组时,会触发两次 beforeUpdate 方法。当我推送新项目时,情况并非如此。有谁知道为什么要这样做?它搞砸了我的应用程序... 最佳答案 经过反复试验,我找到了解决方案
很清楚如何访问新值,第一个参数包含它们 更新前:函数(值,cb){....} 但是我怎样才能访问要替换的当前值呢? 最佳答案 为了访问当前值,您必须进行调用并获取当前记录。 models/user.j
我如何在 sequelize 上使用 beforeUpdate 钩子(Hook)中止更新操作并返回一个对象作为中止更新的结果, 如果我有类似的东西: User.beforeUpdate(functio
在旧的 Grails 版本中,我们在域类中有这些 beforeUpdate、beforeInsert、beforeSave 事件。 我在 Grails 3.x 中找不到它们了 - 我现在如何轻松处理这
我有一个带有 2 个 Hook 的简单用户模型。 User.beforeCreate(setSaltAndPass) User.beforeUpdate(setSaltAndPass) 第一个完美运行
我正在为我的无服务器 lambda 函数使用 Sequelize Typescript 模块。用户模型有两个钩子(Hook),beforecreate 和 beforeupdate。用户模型如下所示:
我在我的应用程序中使用 grails 版本 2.1.0,我在我的域类中有一个 before 插入,它对密码进行如下编码。 包 com.valuelabs.bets.security 类 SecUser
我从 here 尝试过 Golang Gorm Hook ,但在尝试更新表时不触发任何内容 md_transaction 通过型号国防部 ,这是我的golang代码: package models i
在 Sails 的 Waternline 中,我需要能够将以前的值与新值进行比较,并在某些情况下分配新的属性。例如: beforeUpdate: function(newValues, callbac
我们公司使用的大多数域对象都会有一些共同的属性。这些代表创建对象的用户、最后更新对象的用户以及他们用来执行此操作的程序。 为了DRY 的利益退出我的域类后,我想找到某种方法将相同的 beforeIns
想要在保存之前/在 Controller 中创建值之前添加验证逻辑。 想要将错误抛给管理面板用户。因此他们可以更正相同的值并重新提交表单 BeforeSave :我能够添加逻辑。但我不知道如何将错误消
我在Opportunity对象上创建了一个触发器,用于在插入之前和更新之前,通过该触发器将Trigger.newMap变量作为自变量发送给我的顶点类,在其中我根据另一个Object中的记录检查特定组合
我是一名优秀的程序员,十分优秀!