Stack Overflow 社区您好,
我正在使用 NestJS 和 AdminJS 开发一个项目,并且遇到了 TypeScript 找不到模块 @adminjs/nestjs 或其相应类型声明的问题。这个问题阻止我将 AdminJS 与我的 NestJS 应用程序集成。
"@adminjs/nestjs": "^6.1.0",
我尝试过的:
安装:我首先尝试使用 npm 安装 @adminjs/nestjs 包,确保该包已正确添加到我的项目的 package.json 文件中。 导入和使用:安装后,我将 AdminModule 从 @adminjs/nestjs 导入到我的 NestJS 模块中,并尝试根据提供的文档和示例使用它。 TypeScript 配置:我检查了我的 TypeScript 配置,以确保它被设置为识别来自 @adminjs/nestjs 的类型。这包括检查我的 tsconfig.json 文件中是否有可能影响模块解析的任何相关设置。 寻找解决方案:我在 Stack Overflow、GitHub 和其他开发者论坛上搜索了类似的问题。我还检查了 @adminjs/nestjs 的官方文档和 GitHub issues,看看其他人是否遇到并解决了同样的问题。 环境检查:我验证了我的开发环境(包括 Node.js、NestJS 和 TypeScript 版本)与 @adminjs/nestjs 包要求兼容。
最新版本的 AdminJS 仅适用于 ESM - 这意味着它不再与默认的 NestJS 应用程序兼容。 https://docs.adminjs.co/installation/plugins/nest
你基本上有 3 种方法可以解决这个问题:
您的方法是创建以下方法
export const dynamicImport = async (packageName: string) =>
new Function(`return import('${packageName}')`)();
这允许您从 CommonJS 应用程序导入任何 ESM 包,而无需将其自动转换为“require”调用。
然后,在您的 Nest 应用 main.ts 中:
async function bootstrap() {
const app = await NestFactory.create(AdminDashboardModule);
app.useGlobalPipes(
new ValidationPipe({
transform: true,
whitelist: true,
}),
);
const adminJSModule = await dynamicImport('adminjs');
const AdminJS = adminJSModule.default;
const AdminJSMongoose = await dynamicImport('@adminjs/mongoose');
AdminJS.registerAdapter({
Resource: AdminJSMongoose.Resource,
Database: AdminJSMongoose.Database, // Change with whatever adapter you want to use
});
const globalPrefix = 'admin';
const port = process.env.PORT || 3010;
await app.listen(port);
Logger.log(`🚀 Application is running on: http://localhost:${port}/${globalPrefix}`);
}
bootstrap();
在您的模块导入中:
dynamicImport('@adminjs/nestjs').then(({ AdminModule }) => AdminModule.createAdminAsync(.......)
以防万一您使用 uploadComponent(图像文件的示例 AWS 配置):
const uploadModule = await dynamicImport('@adminjs/upload');
const uploadFeature = uploadModule.default;
const adminjs = await dynamicImport('adminjs');
const { ComponentLoader } = adminjs;
const componentLoader = new ComponentLoader();
......
features: [
uploadFeature({
componentLoader,
provider: {
aws: {
region: configService.get(CONFIG_KEYS.AWS_S3.REGION),
bucket: configService.get(CONFIG_KEYS.AWS_S3.IMAGE_BUCKET_NAME),
accessKeyId: configService.get(CONFIG_KEYS.AWS_S3.ACCESS_KEY),
secretAccessKey: configService.get(CONFIG_KEYS.AWS_S3.SECRET_ACCESS_KEY),
},
},
// Set filename as uuidv4 + extension
uploadPath: (record, filename) => FileUtil.generateFileKey(filename),
properties: {
key: 's3Key',
mimeType: 'mime',
bucket: 'bucket',
},
validation: {
maxSize: configService.get(CONFIG_KEYS.IMAGE.MAX_IMAGE_SIZE_MB) * 1024 * 1024,
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],
},
}),
],