跳到主要内容
Deno 2.4 已发布,带来 deno bundle、字节/文本导入、OTel 稳定版及更多功能
了解更多

1月4日事件更新

UTC时间1月4日23:59,在约40分钟内,deno.land/xdeno.land/std 上提供的模块未能正确加载。这是由于一个存在缺陷的补丁导致代码以HTML而非原始文本的形式提供。本文详细介绍了具体发生的情况以及我们未来将采取的防范措施。

所有服务现已恢复正常运行。没有数据丢失。我们非常重视此类中断事件,并为造成的不便深表歉意。

事件时间线

UTC时间23:59,一项变更被合并到deno.land 仓库,该变更改进了语言服务器客户端的补全建议。它还包含了对代码的重构,该代码用于判断是向客户端提供原始代码,还是提供封装在HTML中的代码以在浏览器中显示。该代码对运行时客户端的行为做出了错误的假设,导致HTML被提供给了运行时客户端,而非原始代码。

周三UTC时间00:20,尝试回滚此逻辑,但部署未成功。

UTC时间00:39,代码再次被修改,直接引用 deno.land 的早期部署作为依赖项,这使得代码得以部署并恢复服务。

根本原因

deno.land/xdeno.land/std 向运行时提供了封装在HTML用户界面中的代码,而非纯代码。代码被重构以提供更符合规范的内容协商,但未考虑到 Deno CLI 和 Deno Deploy 等运行时客户端在请求中提供了 Accept 头部,表明所有内容类型(包括 text/html)都是可接受的,因此代码向这些客户端提供了HTML。

Deno Deploy 缺少“回滚”(revert)功能,这意味着无法回滚到上一个提交,而推送到新提交(其依赖于 deno.land/xdeno.land/std 上托管的代码)也并非易事。

用于确定客户端是获取HTML还是纯代码的代码在测试时,对 Deno CLI 和 Deploy 发送的头部信息做出了错误的假设。

影响

在40分钟的中断期间,Deno Deploy 上依赖于 deno.land/xdeno.land/std 的新部署均告失败,提示依赖项不是有效的模块。此外,任何未在 Deno CLI 中本地缓存的 deno.land/xdeno.land/std 远程依赖项也会失败,提示依赖项不是有效的模块。

下一步是什么?

我们正在向 deno.land worker 添加测试,以检验此代码的正确行为。我们还在努力为 Deno Deploy 添加一项功能,以允许“回滚”或“还原”(revert)到先前的部署。