Nuxt Content 3 部署到阿里云 FC 后无法显示内容

151 阅读4分钟

阿里云推广

本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.

前言

前一段时间 Nuxt Content v3 版本发布后便趁机将管理的一个网站更新到了最新版本,结果发布到阿里云函数计算上以后始终访问不到 content 目录下的内容,本地开发预览完全没问题,但线上始终提示找不到文件,考虑到还有其他任务需要完成,于是放弃更新,留着后续有空了再仔细调试。

正文

今天得空通过 FC 的控制台登录到运行中的实例上去看了一下,对比了一下线上环境里的文件数量和本地构建完以后的文件数量,发现数量一致,因此构建和部署过程大概率没问题。

本地通过 node server/index.mjs 启动以后观察到根目录下新创建出了一个 contents.sqlite 的文件,但线上的文件列表里却没有这个文件,因此考虑线上的应用启动过程出了问题。

启用函数计算的日志后再次访问测试环境,以便重新创建函数实例来观察启动过程是否有异样,结果还真是由于环境问题导致的:

2025-03-14 11:31:44[request error] [unhandled] [POST] http://localhost/api/content/content/query?v=v3.3.0--qLYywg2Jop 
H3Error: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found 
(required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node) 
    at Module._extensions..node (node:internal/modules/cjs/loader:1473:18) ... 8 lines matching cause stack trace ... 
    at Object.all (file:///code/server/chunks/nitro/nitro.mjs:4613:17) 
    
    { cause: Error: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found 
    (required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node) 
    at Module._extensions..node (node:internal/modules/cjs/loader:1473:18) 
    at Module.load (node:internal/modules/cjs/loader:1207:32) 
    at Module._load (node:internal/modules/cjs/loader:1023:12) 
    at Module.require (node:internal/modules/cjs/loader:1235:19) 
    at require (node:internal/modules/helpers:176:18) 
    at bindings (/code/server/node_modules/bindings/bindings.js:112:48) 
    at new Database (/code/server/node_modules/better-sqlite3/lib/database.js:48:64) 
    at getDB (file:///code/server/chunks/nitro/nitro.mjs:4577:11) 
    at Object.prepare (file:///code/server/chunks/nitro/nitro.mjs:4585:44) 
    at Object.all (file:///code/server/chunks/nitro/nitro.mjs:4613:17) 
    { code: 'ERR_DLOPEN_FAILED' }, 
    statusCode: 500, 
    fatal: false, 
    unhandled: true, 
    statusMessage: undefined, 
    data: undefined }

看了一下报错日志,发现是环境里缺少 libc 相关的文件导致 better_sqlite3 模块没法正常工作。

那么解决方案就出来了:

  1. 看看 Nuxt Content v3 是否支持其他的 sqlite 读写模块
  2. 找一个合适的 Libc 作为函数计算的层补充到运行环境里去
  3. 更换函数计算的运行时为自定义容器

尝试方案 1 更换 sqlite 读写模块,翻源码后发现 Nuxt 优先尝试加载 sqlite3 模块,找不到的情况下尝试使用 better_sqlite3 模块,因此我们只需要手动安装一下 sqlite3 到项目里就行。

然并卵,发布到测试环境后依然使用的是 better_sqlite3,依然提示 libc 错误:

2025-03-14 13:39:06Listening on http://[::]:3000 Failed to execute SQL CREATE TABLE IF NOT EXISTS _content_info (id TEXT PRIMARY KEY, "ready" BOOLEAN, "structureVersion" VARCHAR, "version" VARCHAR, "__hash__" TEXT UNIQUE); 
-- structure: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found 
(required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node) 
Failed to execute SQL INSERT INTO _content_info VALUES ('checksum_content', false, 'DjRIbndRGL', 'v3.3.0--qLYywg2Jop', 'OKFbrWvbn3'); -- meta: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node)

行吧,那就尝试修复运行环境吧,考虑到找一个合适的 libc 文件并不容易,而且还需要发布一个层到函数计算,操作流程比使用自定义容器部署函数计算实例要长一些,因此考虑直接一步到位换自定义容器。

更换完自定义容器以后,content 目录下的内容就可以正常显示了。

相关内容

推广

欢迎大家领取 阿里云优惠券, 新购续费更优惠, 更有最高 10 % 返现,详询 钉钉: 限量阿里云优惠券