【问题标题】:@aws-sdk\credential-provider-node\dist-cjs\defaultProvider.js:13 CredentialsProviderError("Could not load credentials from any providers", false);@aws-sdk\\credential-provider-node\\dist-cjs\\defaultProvider.js:13 CredentialsProviderError(\"无法从任何提供商加载凭证\", false);
【发布时间】:2023-01-07 15:41:18
【问题描述】:

在我的server/index.js我正在尝试访问的文件aws-appsync查询如THIS文档中所示来自 NodeJS 的 AWS GraphQL.我正在寻找的是访问我之前创建的 aws-appsync 服务来制作GQL查询并得到相应的回应。我的应用同步访问也与aws-cognito有关我是架构上的用户。所以我试图通过使用aws-cognito访问appsync服务我是从服务本身获取数据。但得到错误

E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\dist-cjs\defaultProvider.js:13
throw new property_provider_1.CredentialsProviderError("Could not load credentials from any providers", false);
      ^     CredentialsProviderError: Could not load credentials from any providers
at E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\dist-cjs\defaultProvider.js:13:11
at E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\node_modules\@aws-sdk\property-provider\dist-cjs\chain.js:11:28 
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async coalesceProvider (E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\node_modules\@aws-sdk\property-provider\dist-cjs\memoize.js:14:24)
at async SignatureV4.credentialProvider (E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\node_modules\@aws-sdk\property-provider\dist-cjs\memoize.js:33:24)
at async SignatureV4.signRequest (E:\myProjectName\node_modules\@aws-sdk\signature-v4\dist-cjs\SignatureV4.js:86:29)    at async handler (file:///E:/myProjectName/server/index.js:86:20) { tryNextLink: false }

让我分享我的代码


import express from 'express';
const app = express();
import path from 'path';
const PORT = process.env.PORT || 3000;
import fs from 'fs';
import { fileURLToPath } from 'url';
import crypto from '@aws-crypto/sha256-js';
import { defaultProvider } from '@aws-sdk/credential-provider-node';
import { SignatureV4 } from '@aws-sdk/signature-v4';
import { HttpRequest } from '@aws-sdk/protocol-http';
import { default as fetch, Request } from 'node-fetch';

const { Sha256 } = crypto;
const GRAPHQL_ENDPOINT = 'https://myawsendpoint.amazonaws.com/graphql'
const AWS_REGION = 'us-east-1'
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

app.use(express.static(
path.resolve(__dirname, '..', 'build')
));

app.listen(PORT, (error) => {
    if (error) {
        return console.log('Error during app startup', error);
    }
    console.log("listening on " + PORT + "...");
});

const indexPath = path.resolve(__dirname, '..', 'build', 'index.html');

const query = `query MyQuery {
  listCountrys {
    items {
      countryName
    }
  }
}

const handler = async (event) => {
console.log(`EVENT: ${JSON.stringify(event)}`);

const endpoint = new URL(GRAPHQL_ENDPOINT);
console.log("endpoint", endpoint)

const signer = new SignatureV4({
    credentials: defaultProvider({ timeout: 2000, maxRetries: 2 }),
    region: AWS_REGION,
    service: 'appsync',
    sha256: Sha256
});

const requestToBeSigned = new HttpRequest({
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        host: endpoint.host
    },
    hostname: endpoint.host,
    body: JSON.stringify({ query }),
    path: endpoint.pathname
});

console.log("=== requestToBeSigned", requestToBeSigned)

const signed = await signer.sign(requestToBeSigned);
const request = new Request(endpoint, signed);

let statusCode = 200;
let body;
let response;

try {
    response = await fetch(request);
    body = await response.json();
    console.log("=== body response", body)
    if (body.errors)
        statusCode = 400;
} catch (error) {
    console.log("=== body response error", error)
    statusCode = 500;
    body = {
        errors: [
            {
                message: error.message
            }
        ]
    };
}

return {
    statusCode,
    body: JSON.stringify(body)
};

}

app.get('^/public/posts/:id', (req, res, next) => {
        handler()
    });
});

架构:

@aws_iam
@aws_cognito_user_pools
    listCountrys(filter: ModelCountryFilterInput, limit: Int, nextToken: String): ModelCountryConnection

我不知道我实际上错过了什么。我提供的正是文档中所说的内容。谁能赐教吗?提前致谢。


【问题讨论】:

    标签: node.js express amazon-cognito aws-appsync


    【解决方案1】:

    我在使用 Nodemailer 和 AWS SES 时遇到了同样的问题。

    任何像我一样被重定向到这个 SO 问题的人,这项工作可能会有所帮助。

    import * as AWS from "aws-sdk";
    import * as nodemailer from "nodemailer";
    
    export const EmailService = async () => {
        AWS.config.update({
            accessKeyId: process.env.AWS_ACCESS_KEY_ID,
            secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
            region: process.env.AWS_REGION,
        });
    
        const ses = new AWS.SES({ apiVersion: "****-**-**" });
    
        const transporter = nodemailer.createTransport({
            SES: ses,
        });
    
        try {
            const response = await transporter.sendMail({
                from: process.env.ADMIN_EMAIL,
                to: userEmail,
                subject: "Test Mail",
                html: `
                    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
                    <html>
                        <head>
                            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                        </head>
                        <body>
                            <div style="padding:20px;">
                                <div style="max-width: 500px;">
                                    <h2>Test Mail</h2>
                                    <p>
                                        Hi there,<br/><br/>
                                        This is a test mail.
                                    </p>
                                </div>
                            </div>
                        </body>
                    </html>
                `,
            });
    
            if (response?.messageId) {
                return {
                    status: true,
                    message: response?.messageId,
                };
            } else {
                return {
                    status: false,
                    message: "Failed to send email",
                };
            }
        } catch (error: any) {
            return {
                status: false,
                message: error.message,
            };
        }
    };
    
    

    这是实际的做法https://nodemailer.com/transports/ses/

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2018-01-17
      • 2017-06-15
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2019-06-20
      • 1970-01-01
      相关资源
      最近更新 更多