File upload on AWS S3 using the AdminJs

258 Views Asked by At

I am creating an administrator panel using AdminJs. I want to upload files on my S3 bucket. For that, I am using awsProvider.

I am getting an error Could not load credentials from any providers.

Here is the screenshot of the code.

    import model from "../models/wallpapers.model.js";
    import { mongooseDB } from "../mongoConnection.js";
    import { Components, componentLoader } from "../frontend/components.js";
    import uploadFeature, { AWSOptions } from '@adminjs/upload';

    const localProvider = {
        bucket: 'public/files',
        opts: {
            baseUrl: '/files',
        },
    };
    const awsProvider: AWSOptions = {
        accessKeyId: '<accessKey>',
        secretAccessKey: '<secret_key>',
        region: '<region>',
        bucket: '<bucket name>',
    }

    export const WallpapersResourceOptions = {
        databases: [mongooseDB],
        resource: model,
        options: {
            properties: {
                image: {
                    isVisible: { create: false, list: true, show: true },
                    components: {
                        list: Components.ImageBox,
                        show: Components.ImageBox,
                    }
                },
                file: {
                    isVisible: {
                        list: false,
                        show: false
                    }
                },
                createdAt: { isVisible: false },
                updatedAt: { isVisible: false },
                _id: { isVisible: false },
                isDeleted: { isVisible: false },
            }
        },
        features: [
            uploadFeature({
                provider: {
                    aws: awsProvider
                    // local: localProvider,
                },
                validation: { mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'] },
                componentLoader: componentLoader,
                properties: {
                    key: "image",
                    mimeType: "mimeType",
                    filePath: "/files",
                },
                uploadPath: (record: any, filename: string) => {
                    const data = JSON.parse(JSON.stringify(record))
                    // const json = JSON.parse(data)
                    const folderName = data?.populated?.projectId?.title
                    return `${folderName}/${filename}`;
                },
            }),
        ],
    };

Error Log

         CredentialsProviderError: Could not load credentials from any providers
            at /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/credential-provider-node/dist-cjs/defaultProvider.js:13:11
            at /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/property-provider/dist-cjs/chain.js:12:39
            at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
            at async coalesceProvider (/Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/property-provider/dist-cjs/memoize.js:14:24)
            at async SignatureV4.credentialProvider (/Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/property-provider/dist-cjs/memoize.js:33:24)
            at async SignatureV4.signRequest (/Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/signature-v4/dist-cjs/SignatureV4.js:106:29)
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthMiddleware.js:16:18
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/middleware-retry/dist-cjs/retryMiddleware.js:27:46
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/middleware-flexible-checksums/dist-cjs/flexibleChecksumsMiddleware.js:57:20
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:7:26
            at async updateRecord (file:///Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@adminjs/upload/build/features/upload-file/factories/update-record-factory.js:75:17)
            at async file:///Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@adminjs/express/lib/buildRouter.js:24:22

I tried fileupload using localprovider and it's working fine. I pass correct AWS S3 credentials. I cross checked with a separate Node.js project developed in Express.js.

1

There are 1 best solutions below

2
Jay Kukadiya On BEST ANSWER

In this updated version, we have replaced the previous awsProvider object with the new structure as you specified for the newer version of the AWS package. This object now contains the necessary credentials, region, and bucket information.

const awsProvider = {
     credentials: {
        accessKeyId: '<accessKey>',
        secretAccessKey: '<secret_key>',
     },
     region: '<region>',
     bucket: '<bucket name>',
}