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.
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.