我正在尝试使用S3实现在芥末上托管他们的文档中的例子文件。虽然使用SharedIniFileCredentials
设置凭据在Node中非常有用,但我需要在浏览器中使用相同的功能。
在这里,我得到以下错误
aws_sdk__WEBPACK_IMPORTED_MODULE_1___default(...).SharedIniFileCredentials不是构造函数
这是我的代码(在节点内部运行很好,但在React组件中抛出一个错误):
import AWS from 'aws-sdk';
export const createS3Client = (): AWS.S3 => {
const credentials = new AWS.SharedIniFileCredentials({ profile: 'wasabi' });
AWS.config.credentials = credentials;
AWS.config.credentials.accessKeyId = process.env.NX_WASABI_KEY;
AWS.config.credentials.secretAccessKey = process.env.NX_WASABI_SECRET;
AWS.config.region = process.env.NX_WASABI_REGION;
const ep = new AWS.Endpoint(process.env.NX_WASABI_ENDPOINT);
const s3 = new AWS.S3({ endpoint: ep });
return s3;
};
export const getFile = async (key: string): Promise<Buffer> => {
const s3 = createS3Client();
const params = {
Bucket: process.env.NX_WASABI_BUCKET,
Key: key,
};
const data = await s3.getObject(params).promise();
return data.Body as Buffer;
};
我尝试这样做的主要原因是,我希望将存储在桶中的图像加载到FE (React)组件中,这些映像是不可公开使用的。
这是有问题的组成部分:
import { useEffect, useState } from 'react';
import { getFile } from '../../lib/wasabi';
import Image from 'next/image';
import styles from './PaletteImage.module.scss';
interface Props {
name: string;
source: string;
}
const PaletteImage = ({ name, source }: Props) => {
const [isLoading, setIsLoading] = useState(true); // component needs to load image data on mount
const [error, setError] = useState<string>();
const [base64, setBase64] = useState<string>();
useEffect(() => {
const parseImage = async () => {
try {
const buffer = await getFile(source);
setBase64(buffer.toString('base64'));
} catch (e) {
setError(e.message);
} finally {
setIsLoading(false);
}
};
parseImage();
}, []);
return (
<div className={styles.imageContainer}>
{isLoading ? (
'loading'
) : error ? (
error
) : (
<Image
alt={name}
layout="fill"
objectFit="contain"
objectPosition="left top"
src={`data:image/jpeg;base64, ${base64}`}
/>
)}
</div>
);
};
export default PaletteImage;
谢谢你的帮助。
发布于 2022-06-27 19:03:56
您需要使用AWS.SharedIniFileCredentials的替代方法,因为AWS的浏览器脚本不支持它,而且浏览器版本的JavaScript也无法访问用于从本地文件系统检索凭据的AWS.SharedIniFileCredentials。
可用的选项包括CognitoIdentityCredentials或网络联邦标识。请参阅:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-browser.html
我建议您参考AWS Javascript SDK的以下文档:
干杯
https://stackoverflow.com/questions/72756942
复制相似问题