译者:飞龙

来源:Model Hooks

如果你想要监听发生在模型实例上的事件,你可以附带一个函数,它会在发生时调用。

现在支持下面这些事件:

  • afterLoad:(无参数)加载和准备所用实例之后;
  • afterAutoFetch:(无参数)自动获取关联(如果有的话)之后,无论有没有关联都会触发;
  • beforeSave:(无参数)尝试保存之前;
  • afterSave:(bool success)保存之后;
  • beforeCreate:(无参数)尝试保存新的实例之前(优先于beforeSave);
  • afterCreate:(bool success)保存新的实例之后;
  • beforeRemove:(无参数)尝试删除实例之前;
  • afterRemove:(bool success)删除实例之后;
  • beforeValidation:(无参数)在所有验证之前,优先于beforeCreatebeforeSave

所有钩子函数调用时,this为对应的实例,所以你可以访问到与之相关的任何东西。

对于所有before*钩子,你可以添加一个额外的参数到钩子函数中。这个函数用来告诉钩子应该继续执行下去还是中断。你或许已经从Express的工作流中熟悉了这一点。下面是一个示例:

var Person = db.define("person", {name    : String,surname : String
}, {hooks: {beforeCreate: function (next) {if (this.surname == "Doe") {return next(new Error("No Does allowed"));}return next();}}
});

这个工作流允许你在调用next之前执行异步的操作。如果你不打算使用next就不要把它定义为参数,否则会阻塞工作流。

常见问题

一个常见问题涉及到在钩子内部的嵌套回调中访问this。这个问题的原因是,this对象仅仅在顶级钩子函数的作用域内是有效的,而在回调中会有各种不同的值。要解决这一问题,可以创建一个对象保存this的引用,并且在回调中用它来访问模型的属性。

示例

var Person = db.define("person", {name    : String,surname : String
}, {hooks: {beforeCreate: function (next) {var _this = this;checkName(this, function(err, result)) {if(err) return next(err);_this.name = result.name;_this.surname = result.surname;next();}}}
});

orm2 中文文档 3.3 模型钩子相关推荐

  1. orm2 中文文档 3. 定义模型

    译者:飞龙 来源:Defining Models 在[连接](1. Connecting to Database.md)之后,你可以使用连接对象(db)来定义你的模型.你需要指定模型的名称,一个用于描 ...

  2. orm2 中文文档 3.2 模型验证器

    译者:飞龙 来源:Model Validations Enforce模块用于验证数据.对于使用以前的验证器的用户,还可以继续使用,它们中的一部分整合到了enforce,剩余部分还没有.推荐你开始使用o ...

  3. orm2 中文文档 3.1 模型属性

    译者:飞龙 来源:Model Properties 模型和一些关联具有一个或多个属性,每个属性有类型以及一些可选设置,你可以自行选择它们(或使用默认设置). 类型 受支持的类型是: text:文本字符 ...

  4. orm2 中文文档 5. 同步和删除模型

    译者:飞龙 来源:Syncing and dropping models 同步是一项功能方法,可以在数据库里为你的模型和关联创建所需的表来工作.现存的表并不会被替换,它们只会在不存在的时候被创建. 同 ...

  5. orm2 中文文档 8. 聚合

    译者:飞龙 来源:Aggregation 如果你需要从一个模型中获取一些聚合值,你可以使用Model.aggregate().下面通过一个例子来展示: Person.aggregate({ surna ...

  6. orm2 中文文档 4.3 extendsTo(一对一关系)

    译者:飞龙 来源:extendsTo 你可能想把可选的属性分割到另一个表中.每个扩展都会是一个新的表,其中每一行的唯一标识符是主模型实例的id. 例如: var Person = db.define( ...

  7. orm2 中文文档 4.2 hasMany(多对多关系)

    译者:飞龙 来源:hasMany hasMany 是多对多的关系(包括连接表). 例如:Patient.hasMany('doctors', Doctor, { why: String }, { re ...

  8. orm2 中文文档 4.1 hasOne(多对一关系)

    译者:飞龙 来源:hasOne hasOne关联是一种多对一的关系,意思是你定义的模型可以有多个实例指向一个其它的实例(所属相同模型或不同模型). 用法 Animal.hasOne(associati ...

  9. orm2 中文文档 2. 设置

    译者:飞龙 来源:Settings 设置用于储存键值对.设置对象是orm(默认值)上的实例,之后会为每个db连接和每个定义过的Model建立快照.所以orm.settings上的更改只会作用于更改之后 ...

最新文章

  1. SharpDevelop插件系统创建过程全面分析
  2. fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”?
  3. 判断scrollview是否滚动到了底部
  4. 如何在 ASP.Net Core 中使用 LoggerMessage
  5. Node.js server使用
  6. Python删除文件夹和建立文件夹
  7. 微信小程序自定义组件
  8. 788. 逆序对的数量
  9. (最短路)17bupt新生赛——F. ch追妹
  10. MySQL数据库餐厅点菜系统_Java实现餐厅点餐系统的实例代码
  11. 磁珠的串联和并联分析:
  12. Linux和操作系统从入门到进阶2020最新书单大佬力荐
  13. spring框架 -- IOC
  14. 【读书笔记】见识——吴军
  15. 人工智能数学基础: 18-Haar矩阵的Kronecker积构造
  16. Centos7 下搭建小幺鸡接口管理工具
  17. 全国省份、地级市数据库
  18. 滑环在管线防滑安全固定器中的作用是什么
  19. Instant Client Light:unsupported server character set ZHS16GBK
  20. Java开源项目—知识付费(多个版本)

热门文章

  1. python做单元测试_如何使用python做单元测试?
  2. java中后退键_java - 单击后退按钮两次以退出活动
  3. TCP协议的部分解析(2)
  4. (())、let、expr、bc等计算命令的使用语法和应用技巧
  5. 网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开
  6. 从程序员到项目经理(四):外行可以领导内行吗
  7. php与数据库如何连接,PHP中如何连接数据库
  8. 邵阳市工业学校计算机29班,邵阳市南门口大祥区沙子坡文明路11号计算机学校...
  9. 云端服务器怎么维护,云端服务器怎么维护
  10. 厉害插件_2个相见恨晚的浏览器插件,让你的工作效率提升100%