数据钩子是配合Bmob云函数使用的一个强大的模块,所有的数据请求都会先经过数据钩子,再和Bmob后端云进行交互,系统架构如下:

由此可见,数据钩子可以帮我们实现包含但不限于如下场景:
-
限制或者允许某些表的增加、更新、删除或者查询。
-
限制或者允许某个平台(Android、iOS或者API)的访问。
-
对客户端上传的数据进行二次校验和处理。
-
对查询的数据进行二次处理。
开启和设置数据钩子¶
在 应用 -> 设置 -> 钩子配置 中开启钩子和设置对应的云函数,如下图所示。

上面的例子中,针对这个应用的所有新增数据的请求,都会先转到 test 这个云函数先进行处理。
这里需要注意的是,钩子服务是针对所有表的处理,如果你设置了钩子,建议一定要加上对表名的判定,以免造成错误。
限制或者允许某些表的增删改查¶
如果我们要设置限制对 Order 订单表的数据请求,可以编写云函数如下:
function onRequest(request, response, modules) {
let tableName = request.body.table;
if(tableName=="Order") {
response.send({"msg": tableName + "表禁止操作"});
}
else{
response.send({"msg": "ok"});
}
}
其中,request.body.table是Bmob收到前端请求后,自动给云函数转发过来的标记,表示请求的表名。
response.end({"msg":"ok"}) 表示告诉数据钩子,这个请求还要按原来的需求,继续下一步的操作。如果msg返回的内容不是ok,则不再请求Bmob后端云,直接返回客户端。
除了table标记之外,Bmob收到前端请求后,会自动给 request.body 添加如下标记:
-
request.body.caller:表示请求的客户端,值分别为:Android、IOS或者空。 -
request.body.ua:表示请求的user_agent信息。 -
request.body.token:表示请求的登录用户的sessionToken信息。 -
request.body.operation:表示请求类型,值分别是:create、update、delete、query。
限制或者允许某个平台(Android、iOS或者API)的访问¶
如果我们要限制IOS平台的访问,可以编写云函数如下:
function onRequest(request, response, modules) {
// 获取请求平台
let caller = request.body.caller;
if(caller=="IOS")){
response.send({"msg":"禁止IOS访问"});
}
else{
response.send({"msg":"ok"});
}
对客户端上传的数据进行二次校验和处理¶
假如我们要对客户端上传上来的 sex 字段进行判定,如果值为 男 的话,设置 sex 字段为 1 ,否则设置为 0 ,可以编写云函数如下:
function onRequest(request, response, modules) {
let data = JSON.parse(request.body.data);
data["$set"]["sex"] = dm["$set"]["sexText"] == "男" ? 1 : 0;
let backData = {
"success": "ok",
"data": JSON.stringify(data)
};
response.end(backData);
}