找不到模块“@adminjs/nestjs”或其相应的类型声明.ts(2307)

问题描述 投票:0回答:1

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 包要求兼容。

typescript postgresql nestjs typeorm adminjs
1个回答
0
投票

最新版本的 AdminJS 仅适用于 ESM - 这意味着它不再与默认的 NestJS 应用程序兼容。 https://docs.adminjs.co/installation/plugins/nest

你基本上有 3 种方法可以解决这个问题:

  • 恢复到旧版本的 AdminJS(这可能会导致某些数据库适配器出现问题,尤其是 Mongoose 适配器)
  • 按照他们的指南并更改 tsconfig 文件 - 这从根本上改变了 Nest 应用程序处理导入的方式,并且根据您的配置和依赖项,您可能会看到很多东西被破坏
  • 第三个,虽然(有点)hacky,是一个很好的折衷方案,允许您使用最新版本的 AdminJS(撰写本文时为 6.1.0),而无需修改 tsconfig 文件。

您的方法是创建以下方法

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'],
            },
        }),
    ],
© www.soinside.com 2019 - 2024. All rights reserved.