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.
Earlier we can directly assign accessKey and secreatAccessKey to the AWSProvider. The updated version must be provided in the credentials properties.
const awsProvider = {
credentials: {
accessKeyId: '<accessKey>',
secretAccessKey: '<secret_key>',
},
region: '<region>',
bucket: '<bucket name>',
}