部署集成AdminJS的NestJS应用至Vercel时遇错误
NestJS集成AdminJS部署Vercel时缺失JSON文件的问题
报错信息
[Nest] 8 - 01/17/2024, 10:32:50 AM ERROR [ExceptionHandler] Cannot find module '/var/task/node_modules/adminjs/lib/locale/de/translation.json' imported from /var/task/node_modules/adminjs/lib/locale/index.js Error: Cannot find module '/var/task/node_modules/adminjs/lib/locale/de/translation.json' imported from /var/task/node_modules/adminjs/lib/locale/index.js at new NodeError (node:internal/errors:405:5) at finalizeResolution (node:internal/modules/esm/resolve:332:11) at moduleResolve (node:internal/modules/esm/resolve:995:10) at moduleResolveWithNodePath (node:internal/modules/esm/resolve:939:12) at defaultResolve (node:internal/modules/esm/resolve:1181:79) at nextResolve (node:internal/modules/esm/loader:163:28) at ESMLoader.resolve (node:internal/modules/esm/loader:835:30) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:18) at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:77:40) at link (node:internal/modules/esm/module_job:76:36) INIT_REPORT Init Duration: 1759.70 ms Phase: init Status: error Error Type: Runtime.ExitError
相关类似问题
- Next.js + AdminJS 遇到相同问题
- Express + AdminJS 遇到相同问题
版本信息
- NestJS: 10.0.0
- AdminJS: 7.5.2
- Node.js 18.x
排查发现
部署到Vercel时,AdminJS依赖的.json文件在构建产物中缺失,本地构建的node_modules包含这些文件,但Vercel构建后的产物中没有:
解决方案
1. 配置Vercel保留指定JSON文件
在项目根目录创建vercel.json,添加函数配置,明确指定需要包含的AdminJS语言JSON文件:
{ "functions": { "dist/main.js": { "includeFiles": "node_modules/adminjs/lib/locale/**/*.json" } } }
注意:路径需匹配你的NestJS构建后入口文件(通常是dist/main.js)。
2. 手动注册所需语言,避免自动加载全部语言
在AdminJS初始化时,仅导入并注册你实际使用的语言包,跳过未使用的语言(比如报错中的德语):
import AdminJS from 'adminjs'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; // 仅导入需要的语言文件 import enLocale from 'adminjs/lib/locale/en/translation.json'; import zhCNLocale from 'adminjs/lib/locale/zh-CN/translation.json'; // 注册语言 AdminJS.registerLocale('en', enLocale); AdminJS.registerLocale('zh-CN', zhCNLocale); async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(process.env.PORT || 3000); } bootstrap();
3. 构建脚本中复制缺失文件
修改package.json的构建脚本,在构建完成后复制AdminJS的语言JSON文件到产物目录:
{ "scripts": { "build": "nest build", "vercel-build": "npm run build && cp -r node_modules/adminjs/lib/locale dist/node_modules/adminjs/lib/locale" } }
此方法确保构建产物中包含所需的JSON文件,不过需要确认dist目录下的node_modules结构是否符合Vercel的运行要求。
内容的提问来源于stack exchange,提问作者yarex
相关产品推荐
相关产品推荐

