npm 包 objection-events 使用教程

简介

Objection.js 是一个基于 Node.js 的 ORM 库,可以方便地与各种关系型数据库进行交互。而 objection-events 则是一个为 Objection.js 提供事件支持的 npm 包。通过使用 objection-events,我们可以在 ORM 过程中监听和处理各种事件,可以帮助我们更好地控制数据流程和状态,提高代码的健壮性和可维护性。

安装

在项目中使用 npm 进行安装:

--- ------- ----------------

基本用法

如何监听事件?

首先,我们需要在 Objection 的 Model 定义中引入 objection-events:

----- --------- - ---------------------
----- --------------- - ----------------------------

----- ------- ------- -------------------------------- -
  ------ --- ----------- -
    ------ -----------
  -
-

此时,MyModel 就可以使用 objection-events 提供的 EventManager 来监听各种事件了。EventManger 是一个单例,负责管理整个应用程序中的事件,无须新建实例。

----- ------------ - -----------------------------------------

------------------------- -------- ----- ------ -- -
  ------------------------ -------
---

使用 eventManager.on(event, modelClass, handler) 方法即可监听某个 Model 的某个事件。其中 event 是事件名,modelClass 是对应的 Model,handler 是对事件的处理函数。我们可以定义多个 handler 对同一个事件进行处理,它们将在事件触发后依次执行。

如何触发事件?

在 Objection 中,我们可以通过调用 Model 的一些方法来触发相应的事件。例如在新增数据时,我们可以调用 Model 的 $query() 方法:

----------------------------- ----------

此时,我们在 eventManager.on('insert', MyModel, handler) 中定义的 handler 函数将被自动触发。

事件的上下文

由于同一个事件的处理函数可能存在多个,因此我们需要对事件的上下文进行控制,避免误操作和冲突。

在每个事件中,eventManager 会为处理函数提供一个 Context 对象,包含了事件的上下文信息:

------------------------- -------- ----- ------ -- -
  ------------------------ ------ ----- ----------
---

我们在这里为处理函数添加了一个参数 ctx,它是事件上下文,包含了触发事件的一些信息,例如用户信息、请求信息等。

在使用事件时,我们可以通过 eventManager.setContext(ctx) 来设置当前上下文:

------------------------------ --------
----------------------------- ----------

此时,ctx.user 将会输出 'Bob'。

事件回调

事件处理函数支持回调机制,可以进行异步操作。

在处理函数中,我们可以调用 ctx.callback() 来通知事件回调:

----- --------- - ---------------------
----- --------------- - ----------------------------

----- ------- ------- -------------------------------- -
  ------ --- ----------- -
    ------ -----------
  -

  ------ ----- ------------ -
    ----- ----- - ----- --------------------- ---- ---
    -------------------- ------ --- -- -
      -- ----- -
        ------------------- -- ---- ---------- -----
      -
    ---
    ------ ------
  -
-

-------------------------- -------- ----- ------ ----- -- -
  -- ------
  ----------------------- -------
  -------
---

在这里,我们重写了 MyModel 的 create 方法,在插入新数据后,使用 this.emit('created', model, done) 方法触发了一个名叫 'created' 的事件,并附上一个回调函数 done。在处理函数中,我们处理完逻辑后再调用 done(),通知事件回调。

事件拦截器

在事件处理过程中,我们可以使用事件拦截器来对事件进行控制和干预。

在 Objection 中,我们可以使用 beforeInsertafterInsert 等钩子函数来进行插入操作的拦截。与它们类似的还有:beforeUpdate、afterUpdate、beforeDelete、afterDelete。

我们可以在 Model 的静态属性中定义这些钩子:

----- --------- - ---------------------
----- --------------- - ----------------------------

----- ------- ------- -------------------------------- -
  ------ --- ----------- -
    ------ -----------
  -

  --------------------------- -
    -- ------------------------------- -
      ------ ----------------------------------
    - ---- -
      -- ----------
      ------ ------------------ ------------------- -------------
    -
  -

  -------------------------- -
    --------------------- ------
    ------ ---------------------------------
  -
-

--------------------------- -------- ----- ------ -- -
  ------------------------ ------ ----- ----------
---

在这里,我们定义了一个 beforeInsert 钩子,在这个钩子中我们判断是否为管理员,只有管理员可进行数据插入,否则会抛出错误。在 $afterInsert 钩子中,我们使用 this.emit('inserted', this) 触发一个 inserted 事件,事件回调会输出插入的数据信息。

示例代码

----- --------- - ---------------------
----- --------------- - ----------------------------

----- ---- - ----------------

----- ------------ - -----------------------------------------

----- -- - ------
  ------- ----------
  ----------- -
    --------- ----------
  -
---

----- ------- ------- -------------------------------- -
  ------ --- ----------- -
    ------ -----------
  -

  --------------------------- -
    -- ------------------------------- -
      ------ ----------------------------------
    - ---- -
      -- ----------
      ------ ------------------ ------------------- -------------
    -
  -

  -------------------------- -
    --------------------- ------
    ------ ---------------------------------
  -
-

--------------------------- -------- ----- ------ -- -
  ------------------------ ------ ----- ----------
---

------ -- -- -
  ----- --------------------------------- ----- -- -
    -----------------------
    ---------------------
  ---

  -- -----
  ------------------------------ ------ ---- ------ --------- ---------

  ----- ----------------------------- ----------

  -- -----
  ------------------------------

  -------------
-----

以上代码演示了如何在 Objection.js 中使用 objection-events,我们定义了一个 MyModel,并在 beforeInsert 钩子中对普通用户进行了禁止插入的控制,在 afterInsert 钩子中触发了一个 inserted 事件,在事件回调中输出了插入的数据信息。最后使用 async/await 方式插入了一条数据,并输出了相应的日志。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/600668f4d9381d61a3540e49


猜你喜欢

  • npm 包 react-native-highlight-updates 使用教程

    在 React Native 应用中,我们经常需要关注组件状态及其变更。为了帮助开发者更加直观地理解组件状态的变化,我们可以使用 react-native-highlight-updates 这个 n...

    3 年前
  • npm包optical-js使用教程

    随着前端技术的更新迭代,我们需要日益高效地处理页面中的各种图片、视频等媒体资源,因此实现图片处理的工具也越来越受到前端工程师们的关注。其中一个 npm 包 optica-js ,就是一个提供了各种前端...

    3 年前
  • npm包 gold-iban-input 使用教程

    在现代的前端开发中,有许多优秀的 npm 包可以使用。其中,gold-iban-input 是一个非常实用的库,可以帮助开发者轻松地在网站上集成和管理国际银行账号。

    3 年前
  • npm 包 eslint-config-jm 使用教程

    在前端开发中,代码规范非常重要。而 eslint 是目前最受欢迎的代码规范工具之一。eslint-config-jm 是一款符合公司内部规范的 eslint 配置包,该包是基于 eslint-conf...

    3 年前
  • npm 包 redux-shape 使用教程

    前端开发中,状态管理对于应用程序的设计和复杂程度非常重要。在 React 应用程序中,Redux 是一个流行的状态管理工具。然而,Redux 自身不提供任何数据结构或核心结构。

    3 年前
  • npm 包 wct-headless 使用教程

    在前端开发中,我们经常需要进行单元测试来保证代码质量和稳定性。wct-headless 是一个 npm 包,它可以让我们在无界面的浏览器环境中进行 Web 组件测试。

    3 年前
  • NPM 包 Vuex2VueX 使用教程

    在前端开发中,我们经常使用各种工具来提高开发效率和代码可维护性。其中,状态管理工具是非常重要的一种。Vuex2VueX 是 Vue.js 的状态管理库,它提供了一种集中式存储管理应用程序所有组件的状态...

    3 年前
  • npm 包 bst-lib 使用教程

    什么是 npm 包 bst-lib npm (Node Package Manager)是世界上最大的软件仓库之一,其中包含了各种各样的包,用于前端和后端开发。在这个仓库中,有一个叫做 bst-lib...

    3 年前
  • npm包ppcase-widget使用教程

    什么是PPCase? PPCase是一个专业的码农社区,旨在为开发者提供最新的技术资讯、交流、分享和求助,并提供代码托管、应用市场等优质服务。PPCase致力于成为中文开发者的信仰。

    3 年前
  • npm 包 @babyeyefe/localstorage 使用教程

    前言 在前端开发中,我们经常需要使用浏览器本地存储,而 LocalStorage 是其中一种比较常用且方便的方式。然而,官方提供的 LocalStorage API 的使用方式有些繁琐和不便,因此一些...

    3 年前
  • npm 包 filstem 使用教程

    简介 filstem 是一个用于文件系统操作的 Node.js 模块,它提供了一系列非常方便的方法来处理文件和目录,比如读取、创建、修改、删除、重命名等。使用 filstem 可以帮助我们更加高效地编...

    3 年前
  • npm 包 @kingjs/descriptor.object.clone 使用教程

    在前端开发中,我们经常需要操作对象数据,例如复制一个对象。但是 JavaScript 中对象是引用类型,直接复制会导致原对象和复制后的对象共用同一块内存,修改一个对象会影响到另一个对象。

    3 年前
  • npm包@kingjs/descriptor.object.writable-symbol使用教程

    前言 随着前端技术的不断发展,越来越多的开发者开始使用各种工具和库来提高自己的工作效率,其中npm包@kingjs/descriptor.object.writable-symbol就是一款非常优秀的...

    3 年前
  • npm 包 @kingjs/descriptor.writable-symbol 使用教程

    简介 @kingjs/descriptor.writable-symbol 是一个 npm 包,它提供了一种方便的方法来创建可写的 Symbol。这可以非常有用,例如在创建对象时创建一个纯粹的数据描述...

    3 年前
  • npm 包 `generator-node-module-ts` 使用教程

    导语 当你在进行 Node.js 开发时,难免会涉及到创建 npm 包。而在创建的过程中,我们根据业务需求需要编写不同的代码,而这些代码可能会被用于多个项目中,因此,我们需要一种工具来帮助我们快速创建...

    3 年前
  • npm 包 @thematter_io/plasma.js 使用教程

    前言 随着前端技术的不断发展,现代前端开发越来越复杂,需要使用各种工具和框架来提高开发效率。其中,npm(Node Package Manager),是一个非常重要的工具,可以方便地下载并安装我们需要...

    3 年前
  • npm包 nvcli使用教程

    Nvcli 是一个基于命令行的工具,它可以对npm仓库进行查询,让我们能够更快捷地查询和安装npm包,而不需要去网页进行搜索和下载。 在本文中,我们将介绍如何安装和使用nvcli,并提供几个关于其实用...

    3 年前
  • npm 包 vue-co-dialog 使用教程

    在前端开发中,经常需要使用到弹窗功能。而 vue-co-dialog 是一个方便易用的 npm 包,可以帮助我们快速实现各种类型的弹窗。该 npm 包提供了丰富的选项和功能,可以满足大部分的业务需求。

    3 年前
  • npm 包 @kingjs/descriptor.is-frozen 使用教程

    如今前端开发中,我们经常需要用到对象。而对象可以包含若干个属性,这些属性都可以单独进行访问和修改。但是,由于 JavaScript 是一门动态语言,属性的新增和修改并没有受到限制,所以对象的属性会变得...

    3 年前
  • npm 包 elmish-ts 使用教程

    什么是 elmish-ts elmish-ts 是一个 JavaScript 库,它提供了一个用于构建在架构上工作的应用程序的模型,以及减少了在应用程序中出现的错误数量的 API。

    3 年前

相关推荐

    暂无文章