首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用beforeUpdate Hook续订中止更新操作

如何使用beforeUpdate Hook续订中止更新操作
EN

Stack Overflow用户
提问于 2020-10-14 22:23:09
回答 1查看 461关注 0票数 3

如何在续集时使用beforeUpdate钩子中止更新操作,并作为中止更新的结果返回对象,

如果我有这样的东西:

代码语言:javascript
复制
User.beforeUpdate(function(user, options) {
  if (user.name == "example_name") {
  // abort operation here 
  // return object to the update caller
  }
}
EN

回答 1

Stack Overflow用户

发布于 2022-03-01 12:39:34

钩子之前的throw 确实阻止了更新

例如:

代码语言:javascript
复制
  beforeUpdate: (integerName, options) => {
    if (integerName.value === 5) {
      throw new Error('beforeUpdate')
    }
  },

并抛出.update调用者。

但是,请从为什么续写beforeUpdate钩子不起作用?中记住,只有在调用方使用:

代码语言:javascript
复制
Model.update({}, {individualHooks: true})

记住每次通过都会很烦人。

然而,beforeValidate钩子即使没有individualHooks也会触发,所以也许这就是方法。

create的抛出工作记录在:https://sequelize.org/master/manual/hooks.html#instance-hooks中。

User.beforeCreate(用户=> { if (user.accessLevel > 10 & user.username !== "Boss") {引发新错误(“您不能授予该用户10以上的访问级别”);}; 下面的示例将引发一个错误: 尝试{等待User.create({用户名:'Not a Boss',accessLevel: 20 });} catch (错误){console.log(错误);//您不能授予该用户10以上的访问级别; 以下示例将是成功的: 用户=等待User.create({用户名:'Boss',accessLevel: 20 });console.log(用户);// user对象,用户名为'Boss‘和accessLevel = 20

还提到了:https://github.com/sequelize/sequelize/issues/11298

最小可运行示例:

main.js

代码语言:javascript
复制
#!/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() })

package.json

代码语言:javascript
复制
{
  "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上游。在Ubuntu21.10,PostgreSQL 13.5上测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64362298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档