描述错误
当与后端存储的数据库连接不可用时(使用 postgres 测试),服务器会不断崩溃,而不是正常报告数据库连接问题。
再现
重现行为的步骤:
/admin/plugins
时也会触发预期行为
优雅的回退以显示一些前端错误消息,但尽管缺乏数据库连接,但仍继续运行。
实际行为
[2020-11-12 22:13:05.858] [ERROR] console - error: column "value" is of type jsonb but expression is of type text
at Parser.parseErrorMessage (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:278:15)
at Parser.handlePacket (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:126:29)
at Parser.parse (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:39:38)
at Socket.stream.on (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
at Socket.emit (events.js:198:13)
at Socket.EventEmitter.emit (domain.js:448:20)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
[2020-11-12 22:13:05.858] [INFO] console - Stopping Etherpad...
[2020-11-12 22:13:05.876] [ERROR] console - TypeError: Cannot read property 'name' of null
at Client._handleParseComplete (/home/etherpad/etherpad-lite/src/node_modules/pg/lib/client.js:358:26)
at Connection.emit (events.js:198:13)
at Connection.EventEmitter.emit (domain.js:448:20)
at parse (/home/etherpad/etherpad-lite/src/node_modules/pg/lib/connection.js:109:12)
at Parser.parse (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:40:17)
at Socket.stream.on (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
at Socket.emit (events.js:198:13)
at Socket.EventEmitter.emit (domain.js:448:20)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
附加上下文
Etherpad version
Version number: 1.8.6
Latest available version: 1.8.6
Git sha: 6a8563e
+1 这个。
https://github.com/ether/ueberDB用于我们的数据库抽象 btw。 这不仅仅是 PG 问题,会影响所有 DB。
我会接受 PR,我不确定在哪里最好修复它,我猜当 db 丢失时, ueberdb 可能会发出。
您永远不会想向客户端发送消息,所以可能只是客户端的一般错误,清除后端日志中的错误并缓存到内存,直到数据库恢复.. 问题是缓存到内存直到恢复的数据库 prolly 需要新的逻辑对于每个数据库连接器,这可能比我们有时间做的更大的工作......
值得注意的是,Etherpad 被设计为在错误时死亡,我们尽量不让事情保持活力而是失败。 这是一个早期的设计决定,它得到了很好的回报,因为它迫使我们使 Etherpad 稳定(ish)。Etherpad 的启动脚本将尝试重新启动 Etherpad 并重新建立数据库连接,我不反对我们如何做事,但是我觉得如果数据库消失了,很明显 Etherpad 失败了,因为数据库已经消失了。
我不认为这是连接问题。 column <name> is of type jsonb but expression is of type text
似乎是中间件以意想不到的方式设置查询参数时发生的一种相当普遍的事情。 该列被创建为 JSONB,但是当查询生成器使用类似 JSON.encode 的东西时,类型被推断为字符串并且参数被绑定为类型 TEXT 或 VARCHAR(错误消息中的“字符变化”)。
显然,在存储字符串或数组而不是包含它们的对象时,这也可能是一个问题?
通过谷歌发现的随机示例,与本项目无关: https :
哦,检查恢复的提交。 前段时间有一个糟糕的 pg 提交,我认为是相关的..
我刚刚注意到 - 看起来我们得到了带有 jsonb 的 CREATE TABLE,node_modules 中的版本已经是text
。 FWIW 我们还有带有文本参数的ueberdb_insert_or_update()
,剩余的没有重载......
在我转换之前确定一下,文本应该是什么(现在)?
转换为文本后,一切似乎都有效:
ALTER TABLE storage ALTER COLUMN value TYPE text USING value::text;
最有用的评论
哦,检查恢复的提交。 前段时间有一个糟糕的 pg 提交,我认为是相关的..