首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >aws .SharedIniFileCredentials配置文件:“芥末”浏览器可供选择

aws .SharedIniFileCredentials配置文件:“芥末”浏览器可供选择
EN

Stack Overflow用户
提问于 2022-06-25 19:51:31
回答 1查看 101关注 0票数 0

我正在尝试使用S3实现在芥末上托管他们的文档中的例子文件。虽然使用SharedIniFileCredentials设置凭据在Node中非常有用,但我需要在浏览器中使用相同的功能。

在这里,我得到以下错误

aws_sdk__WEBPACK_IMPORTED_MODULE_1___default(...).SharedIniFileCredentials不是构造函数

这是我的代码(在节点内部运行很好,但在React组件中抛出一个错误):

代码语言:javascript
运行
复制
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)组件中,这些映像是不可公开使用的。

这是有问题的组成部分:

代码语言:javascript
运行
复制
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;

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 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://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/js-sdk-dv-v2.pdf#setting-credentials-browser

干杯

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72756942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档