低代码平台directus 实战半年-踩坑日志

1,089 阅读7分钟

directus 踩坑总结

描述原因如何解决
在directus中的flow中无法在Collection中选择系统表在flow的UI配置页面,默认只能访问自己创建的表通过在选择Collection旁边下拉箭头,选择 Edit Raw Value ,输入系统表即可. Note that I've found you need to enter something in that field first. Otherwise your change won't take. I.e. select one of your non-system collections and then Save your changes. Then go back in and edit -- choosing "Edit Raw Value" , enter something like directus_users and save.
在flow里使用三方库需要导出才能访问在.env里设置 FLOWS_EXEC_ALLOWED_MODULES
Flow 配置webhook 后访问提示没有权限 { "errors": [ { "message": "You don't have permission to access this.", "extensions": { "code": "FORBIDDEN" } } ] }请求方式设置的get,但实际却用post请求把请求类型改为post即可,但是diectus 的错误提示容易误导。 用forbidden是为了安全,防止嗅探API是否存在。
使用多对一更新数据无效,如在patch方法/items/province/13 传入修改 省份名字+新增一条武汉城市记录 { "name":"湖北", "city" : { "name":"武汉" } } 提示错误 { "errors": [ { "message": "Invalid payload. Invalid one-to-many update structure: "name" is not allowed.", "extensions": { "code": "INVALID_PAYLOAD", "reason": "Invalid one-to-many update structure: "name" is not allowed" } } ] }{ "name":"湖北", "city" : { "name":"武汉" } } 关联的city 应该用数组表达,同时 需要在city的表配置,一对多 province把请求参数调整为 { "name":"湖北", "city" : [ { "name":"武汉" } ] } ,但是上面也是有缺点,会把原来的其他在湖北下的城市都清空,建议改成 { "name":"湖北", "city" : { "create":[ { "name":"武汉" } ] } }
在flow里面 新增一个 operation 的create data 报错提示 { "name": "TypeError", "message": "Cannot read properties of undefined (reading 'startsWith')" }在 operation 没有选择对应的collection在collection输入表名即可
保存flow时候,提示[RECORD_NOT_UNIQUE] Value for field "resolve" in collection "directus_operations" has to be unique.flow中一次不能做多个operation的添加,删除和连接动作。每次创建一个operation就保存一下,删除也保存一下,连接也保存一下
使用 { "name":"湖北", "city" : { "delete":[ 2 ] } } 同时修改 name 和 移除城市关联,但是city没有真正异常,需要单独调用city表删除directus 只做关联的处理,不做表的删除,尤其在多对多的关联关系表也只是断开关系只能人为主动触发删除city的逻辑
当修改数据模型,如把字段user_id 修改为user,其他同事的调用flow读取字段还是使用之前的user_iddirectus 每次启动的时候应该缓存了所有字段的定义,导致读取的不是最新的字段有问题的电脑重启directus 即可
在directus配置 多对一关联表的时候,总是提示报错 { "errors": [ { "message": "alter table xxx表 add constraint xxxx_foreign foreign key (xxxx) references xxxxx (id) on delete SET NULL - UNKNOWN_CODE_PLEASE_REPORT: Referencing column 'xxxx' and referenced column 'id' in foreign key constraint 'xxxx_foreign' are incompatible.", "extensions": { "code": "INTERNAL_SERVER_ERROR" } } ] }开发环境的数据库早期使用的是jason的设置的utf8mb4_0900_ai_ci规则,而开发环境数据库使用的是utf8mb4_unicode_ci修改开发环境数据库为utf8mb4_0900_ai_ci规则,并且把有问题数据库导出,然后统一替换sql 的utf8mb4_unicode_ci为utf8mb4_0900_ai_ci 再倒入
在创建数据的operation里面 如果直接设置"{{exec_create_body.createList}}",创建的时候会变成一个大字符串默认是自动把输入内容加上转意成 ""{{exec_create_body.createList}}""点击上面的{} 模式,切换到编辑模式
directus 在flow调用另外一个互联网钩子缺失登录的用户数据header信息缺少token信息在头部加入 [ { "value": "{{$trigger.headers.authorization}}", "header": "authorization" } ]
directus 在flow调用另外一个互联网钩子 传入的JSON格式无效,如:{a:1}最终会变成字符串 "body": ""{"a":1}""建议在前面新增一个运行脚本,输出对象,并定义名字如 exec_obj 在使用互联网钩子参数输入 {{exec_obj}}
当日期格式使用timestamp时间戳,输入2099-12-30 会导致sql插入报错directus 计算出来的时间戳,超出数据库限制把存数据库的字段类型修改为datetime 即可
在自己在数据库求和总数和directus查询不一样由于directus 默认限制了查询的条数,查出153条超出限制加上 "limit": 10000000000, 后续看有没有更好方案
直接想批量更新业务表的多条记录 直接使用 更新数据: [ { "id": "03a7d395-f26f-4e8c-8754-2775b5963bxx", "status": "publish", }, { "id": "03a7d395-f26f-4e8c-8754-2775b5963byy", "status": "publish", } ]虽然也返回修改的id,但是实际并没有真正修改到数据库里由于业务表是用户创建的,所以批量更新可以借助用户表做更新, "collection": "user",然后输入"user_xxx": { "update": [ { "id": "03a7d395-f26f-4e8c-8754-2775b5963bxx", "status": "publish", }, { "id": "03a7d395-f26f-4e8c-8754-2775b5963byy", "status": "publish", } ] ] }
在flow 里面触发另外一个flow 提示:{ "name": "SyntaxError", "message": "Missing "}}" in the template for the "{{" at position 0 within 1000 characters" }由于 flow调用另外一个的时候,下一个flow里面 有错误的代码,但是directus 又把提示方案上一个flow,如在update 表里面 写了错误的代码 虽然也返回修改的id,{ "filter": { "user": { "_eq": "{{$trigger.id]}" } } } 把 } 写成了 ]修复下一个flow的每一个operation的bug即可
在directus 里面新增 数据总是提示 { "message": "Cannot read properties of undefined (reading 'table_type')", "extensions": { "code": "INTERNAL_SERVER_ERROR" } }由于当前新增了一个flow ,里面设置是事件钩子,类型为过滤器,并且监听了item.create, 当前flow存在一些bug,会导致新增失败,目测directus filter类型会以事务方式监听把类型改成 动作 action
如何设置flow是事件钩子并且为action,添加了一个监听了item.create事件,只有在UI上新增生效,在flow的operation触发新增不生效在触发的operation操作数据库时,没有勾选 发出事件在触发的operation操作数据库时,勾选 发出事件
前端无法查询RESTFul 接口无法过滤多层接口需要使用deep关键字过滤const bank_currency = ref() async function fetchBank(id: any) { const { data } = await useFetcher('/items/province', { watch: false, params: { fields: ['city..', '*'], filter: { id, status: 'published', }, deep: { bank_currency: { _filter: { city: { status: 'published', }, }, }, }, }, transform: (res: any) => res.data[0], }) console.log(data.value) }
审核记录表的创建人,设置了系统新增自动创建,但在flow里面创建的时候却新增为空在operation里面设置权限为full_access,由于设置了full_access后是找不到对应的当前操作用户把full_access 改成 from trigger ,则flow里面会自动根据当前用户去做创建用户
在apifox发起单独触发内部的另外一个flow时,总是提示token无效,获取订单的data里的方法找不到由于两个不同的flow直接把上一个完整的上下文包括trigger都打包传递给下一个flow,里面包含header信息,导致接受的flow的header被覆盖1. 把apifox 里面请求的 hader 里面的token信息更新最新的token信息
在apifox发起单独触发内部的另外一个flow时,获取订单的data里的方法找不到由于两个不同的flow直接把上一个完整的上下文包括trigger都打包传递给下一个flow, 而方法只能在上一个flow定义operation才能传递,使用apifox是无法传递方法解析的在第一个触发flow里面添加operation,并且挂载全局data,则下一个flow能正常访问方法
当把flow的类型从 内部另一个flow切换为互联网钩子,参数body的参数会丢失1. 内部另一个flow:参数用的是 trigger.xxx2.互联网钩子多了一个body:参数用的是trigger.xxx 2. 互联网钩子多了一个body:参数用的是 trigger.body.xxx新增body属性即可
在directus后台,发现上账时,收到两条入账记录, 1个域名是 test-api.cn 2. 另外一个是localhost:8055开发同事本地也启动了服务,由于启动了两个服务,都会收到上账中心下发的消息,导致有两条写入入账的记录直接在创建入账的时候判断订单号是否重复
当在本地环境新增了数据,做了响应的flow 无法被正常触发未确定还是使用回开发环境新增,开发环境flow响应正常
定时flow 处理提醒时,添加了当天已经发送就不再重复发的判断,但实际情况 没有生效使用的filter 的 "day(date_created)": { "_eq": "{{exec_obj.day}}" }, "year(date_created)": { "_eq": "{{exec_obj.year}}" }, "month(date_created)": { "_eq": "{{exec_obj.month}}" } 来过滤日期,没有+8小时处理 ,要到第二天8点才算第二天不使用系统自带的date_created,另外新增一个server_date_created(字符串) 服务器创建的日期字段
使用 node:crypto' 库进行验签报错 提示 node: internal/crypto/sig:230 return this [kHandle].verify(data, format, type, passphrase, signature, Error: error: 1E08010C:DECODER routines: :unsupported刚开始在flow 在调用报错,单元测试没有问题,以为是环境问题,其实是自己flow用了不规范的测试数据造成,如使用了"1111" 这种数据做公钥只需要传入正确的参数即可,不过如果对方的公钥前面包含多余的空格也会导致失败,记得做把数据做 xx.trim()处理
执行npm init directus-project example-project 创建失败 报Directus requires Node.js 18, specifically version 18.17 or higher (>=18.17 & <19).Please adjust your Node.js version and try again.directus 不支持太高版本的node,当前是20的版本使用nvm use 18.18.0 切换到低一点的版本
执行npm init directus-project example-project 创建失败 报npm ERR! gyp ERR! cwd /Users/jason.yang/Desktop/my-workspace/github/example-project/node_modules/isolated-vm npm ERR! gyp ERR! node -v v18.18.0 npm ERR! gyp ERR! node-gyp -v v8.4.1 npm ERR! gyp ERR! not okpython版本和库缺失```brew install python@3.10 ; echo 'export PATH="/opt/homebrew/opt/python@3.10/bin:$PATH"' >> ~/.zshrc ; source ~/.zshrc ; python3.10 -m ensurepip --upgrade ; python3.10 -m pip install setuptools # 如何还是不行可以试试 python3 -m venv myenv ; source myenv/bin ; activate; pip install setuptools # 以及安装对应脚手架 和 pnpm 安装 npm install @directus/cli````

传送门

  1. 低代码平台directus 实战半年-入门篇 - 掘金 (juejin.cn)

  2. 低代码平台directus 实战半年-提升篇flow - 掘金 (juejin.cn)

  3. 低代码平台directus 实战半年-进阶篇 - 掘金 (juejin.cn)

  4. 低代码平台directus 实战半年-踩坑日志 - 掘金 (juejin.cn)