Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug: 插件往 Channel/User 表新增 json 字段时,没有对已存在的行进行初始化,导致报错 #415

Closed
idlist opened this issue Dec 2, 2021 · 3 comments

Comments

@idlist
Copy link
Contributor

idlist commented Dec 2, 2021

Describe the bug

如题,和 #414 比较相近,也有一部分 Nullable 的问题,但似乎不太一样。
这个问题也是 v3/v4 同时有的问题。

这个问题会导致部分字段类型(比如 json 类型)无法正常使用。
因为似乎对于 ORM json 类型,只有 NULL 和 {} 这两个“空内容”能够被正常解析,而真正的“空”(无内容)是没法被解析的,会直接报 SyntaxError: Unexpected end of JSON input
但是不对已存在的行进行初始化,同时不配置 nullable: true 的话,新增字段的初始值就不会是 NULL,而是“空”了。

Steps to reproduce

const { Tables } = require('koishi')

Tables.extend('channel', {
  test: {
    type: 'json',
    initial: {
      ipsum: 'lorem'
    }
    // 重点在此:配置了 initial 但是不配置 nullable: true
  }
})

module.exports = (ctx) => {
  ctx
    .command('test')
    .action(async ({ session }) => {
      const test = await session.observeChannel(['test'])
      console.log(test)
    })
}

这里有一个比较小的能够复现这个问题的用于 v4 的插件 ,假设叫它 test.js

  1. 找个群 (群 A) 发一句话,让这个群入表
  2. 安装 test.js 插件
  3. 在这个群 A 中运行指令 test
  4. 报错!因为 koishi 没有对已有的行进行初始化,而 ORM 的 json 类型无法解析“空”内容,它只能解析 NULL 和 {}

报错内容如下面的截图。

Expected behavior

#414 一样,还是想 koishi 自身有没有机制能改良一下这个行为,否则的确有点坑

然后或许可以改进一下 json 字段的解析,在空字符串的情况下也能解析成功

Screenshots

image

Versions

  • OS: Win10
  • Platform: all
  • Node version: v16.1.0
  • Koishi version: v3.14.2, v4.0.0-beta-3

使用的是 mysql 数据库

Additional context

所以说了半天,要不始终默认 nullable: false 吧
默认所有新增字段 primary key 和 foreign key 的 nullable: true,其他的 nullable: false 的就没有这个问题了(迫真)

@idlist idlist added the bug BUG label Dec 2, 2021
@idlist
Copy link
Contributor Author

idlist commented Dec 2, 2021

对已有行的初始化这一点,我测试过在字段 = NULL 的情况下做 get/observe 操作的时候是有初始值的,或许可以不做。

这个问题的另一个点在于,json 解析错误的时候就只有那一行报错,无法定位是程序的哪里报错,也无法定位是哪个数据库的哪个字段出了问题。如果能有更加详细的报错信息的话会更好。

@idlist idlist changed the title Bug: 插件往 Channel/User 表新增字段时,没有对已存在的行的对应字段进行初始化,导致报错 Bug: 插件往 Channel/User 表新增 json 字段时,没有对已存在的行进行初始化,导致报错 Dec 2, 2021
@idlist
Copy link
Contributor Author

idlist commented Dec 2, 2021

先把这个问题限定到 ORM json 字段了,不清楚其他类型有没有类似的问题,有就再说。

@shigma
Copy link
Member

shigma commented Dec 3, 2021

JSON 无法解析空串的错误已经修复。

从新版本起 nullable 的默认值将会为 true(仍然可以手动设置为 false,后果自负)。

可能需要一些测试。

@shigma shigma added the commited label Dec 3, 2021
@shigma shigma closed this as completed Dec 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants